软件工程

针对在系统开发生命周期中工作的专业人士,学者和学生的问答

5
在C ++中优化冗余字符串分配
我有一个相当复杂的C ++组件,其性能已成为问题。分析表明,大多数执行时间只是花在为std::strings 分配内存上。 我知道这些字符串之间有很多冗余。少数值非常频繁地重复,但也有很多唯一值。字符串通常很短。 我现在只是在考虑以某种方式重用那些频繁的分配是否有意义。代替1000个指向1000个不同的“ foobar”值的指针,我可以有1000个指向一个“ foobar”值的指针。这样可以提高内存效率,这是一个不错的选择,但是我在这里最担心的是延迟。 我猜一个选择是维护某种已经分配了值的注册表,但是是否有可能使注册表查找比冗余内存分配更快?这是可行的方法吗?

5
将文本标记放在字符串中是否不好?有其他选择吗?
我使用大量字符串,需要大量操作。 例如,我可能会生成这样的字符串: 第1部分船 A节 编程 第2部分用于编程的分区船。 AA 节SQL条目。 该字符串太大,无法手动检查它的每个部分。现在,我需要split将此string分为stringlist几个部分。我可以想到两种选择: 正则表达式: QStringList sl = s.split(QRegularExpression("\n(?=Part [0-9]+|Section [A-Z]+)")); 看起来应该可以,但是有时会漏掉一些异常(即:Section SQL Entries错误地分裂) 否则,我可以做的就是在生成初始字符串时放置一个标记: 🚤💻Part1 船 AA节 编程 🚤💻第2部分用于编程的分区船。 A 第AA 节“ SQL条目”。 这意味着分割字符串将变得容易: QStringList sl = s.split("🚤💻")); 有人告诉我,这些都不是好的样式或编程实践,但是直到现在我还没有讨论它,也没有找到替代方法。 如果您是我的项目经理,您会接受这两种方法吗? 如果没有,您会建议我做为最佳做法吗?


1
Swift为什么需要见证表?
我正在尝试阅读Swift的实现细节,我无法确定的一件事是它的“见证表”。看起来它们是用于结构的单独vtable指针。 但是你为什么需要那个呢?结构是按值复制的,因此在编译时您已经知道它们是什么类型。那么,您是否不只是硬编码要调用的方法并完成该方法呢?为什么要对这些方法执行虚拟调度?

2
覆盖率-算法中的缺陷-如何摆脱它的使用?
介绍 许多主线矢量图形渲染引擎都存在算法缺陷。它们分别渲染每个形状,并通过计算像素覆盖率来消除锯齿,然后将它们彼此叠加在一起。是的,它很简单,但是正确的解决方案甚至更简单。 这就导致了合并问题,因为它通过透明性扩大了覆盖范围。Alpha混合遵循的规则不能准确表示情况,例如,以50%覆盖的像素与50%互补覆盖的像素相邻的像素,其覆盖率最终不会达到100%,而覆盖率最终达到75% 。它的外观取决于算法的调整方式和其他细节,但从本质上讲这是一个已知的错误。甚至有人在记录不同的引擎错误以及写一篇论文说明如何更好地解决问题方面费了很多力气。 图像1:完全不具有代表性的示例,呈现的形状是由三角形组成,在顶部显示放大的误差。SVG来源 这个问题有一个简单的天真解决方案*,只是超级样本,没有覆盖率计算,并且将图像过滤掉。作为奖励,您可以使用比框滤波更好的图像重建算法(请参阅像素不是正方形3)。甚至有些解决方案的速度可以与当前解决方案相提并论,并且这些解决方案在硬件光栅化管道中更容易实现(并且您在GPU上很少看到此错误,因为它是为避免这个问题而构建的)。 这也不是没有成本的问题。有许多从事图形设计工作的人花费大量时间来尝试手动解决此问题,方法是确保此处没有重叠,而那里没有重叠以解决计算机应为他们解决的问题。而且在很多情况下都会失败。但是他们的客户不在乎为什么必须在那里解决错误。 题 错误如何传播?由于它们都在执行相同的错误,因此可以得出结论,他们对算法使用相同的源。是什么导致设计人员选择此算法?为什么只有3D程序员会识别此错误,甚至将其错误编入其API和教学中,而2D程序员却没有呢? 如何确保此错误不再继续传播? 附录(但我不是在问这个) *显然,我声称超级采样无缺陷的工作是非凡的,并且需要非凡的证明。好的,所以超级采样工作的关键是超级采样不进行覆盖处理。本质上,超级采样器将每个样本视为点样本。由于点样本不假设基础区域,因此不会在没有发生的情况下进行alpha比较。 为了使其始终如一地工作,如答案之一所述。为了一致性,我们需要使用整数采样来处理样本。这可以确保每个点一旦转换为屏幕空间,对于相同的坐标都将获得完全相同的解决方案,并且没有任何样本被像素边界遮挡2次。要做到这一点,一个样本可能不会触发一个像素,如果它是例如左侧底部样本,则它可能不会完全打开(因此我们制定了一条规则,即在> vs <=中处理确切的边缘)。除一个控制台图形卡外,其他所有图形卡都按此方式工作。它确保不需要缓存额外的数据,也不需要进行额外的附近测试。与基于覆盖的解决方案相比,该解决方案更稳定,更通用,更一致。 该算法与原始算法完全相同,但代码更少,样本更多。因此,与基于覆盖的算法相比,它甚至是一致的。我们之所以知道这一点,是因为我们几乎在其他任何信号处理领域以及图形卡中都使用了这种方法。 那么这种方法有缺点吗?好吧,如果您只是天真的假设,那就慢了一点。从理论上讲,它比覆盖范围栅格化器具有更快的渐近行为,有点像光线跟踪器,它在典型场景中仍仅处于同等水平。同样,这可能会使基于卷积的效果的使用更加难以实现。

4
每个步骤都有单独的测试方法是一个好主意吗?
我正在测试REST API。假设它返回JSON结构。什么是测试服务器的最佳方法?如果所有先前的步骤都成功,则每个测试步骤都只能成功。 结构A:一次测试所有内容 - Test method 1: - make server request - assert http response code was 200 - assert returned file is not empty - assert returned file has valid JSON syntax - assert returned JSON contains key X 这似乎是最好的解决方案。 优点: 仅一个服务器请求 我正在整体测试行为“服务器是否使用键X返回JSON?” 结构B:向每个测试逐渐添加断言 - Test method 1: - …

5
您是否应该尽量减少创建许多小对象?
在编写经常创建许多(1000个)小对象的东西时,您是否应尝试将其最小化以提高性能?特别是如果您不知道它将在低端台式机到高端台式机甚至是移动设备上运行的系统。对于移动设备,我听说创建很多对象会严重影响性能,尽管我不知道那是多么真实。 我有一个例子很好地说明了这个想法。例如,在图形程序中,存在一种理想地用于所有绘图的方法drawPixel(Point)。可能会创建1000点,并且可能会经常重复,例如在游戏中每秒可能会被调用60次以上。或者,drawPixel(int x, int y)可用于最小化许多Point对象的创建。 在面向对象的设计中,我认为首选使用Point。但是,使用基本类型可以提高性能。在大多数情况下,性能提升可以忽略不计,但是我不确定移动设备或旧机器之类的东西。这样做会提高性能,应该考虑吗?

5
对相似的功能使用不同的模式
我是该项目的唯一开发人员,就像其他软件项目一样,将来可能会被其他人采用。 假设我使用模式X来实现功能A。在开发和完成功能之后,我意识到可以使用我刚刚学习的模式Y来实现相同的功能。但是功能A运行良好,并且从X到Y的重构既耗时又无济于事。 然后是实现功能B的时候了。它与A相似,但是这次我想借此机会使用模式Y。我对最终结果感到满意,比使用功能A更好,但是现在我的代码使用了两个具有相似特征的X和Y不同的图案。 但是没有真正的理由使用不同的模式,除了以下事实:构建功能AI的技能不足以使用与功能B相同的模式。 请注意,此问题不是针对给定问题选择正确的模式;这是在代码库中共存的两种模式,用于解决类似的问题,如果有足够的时间进行重构,则可以将其减少为一种。 该代码闻到了吗? 保持这样的源代码有什么缺点? 我应该只使用一种模式吗?即重构A以使用Y或在编写B时继续使用X? 从源头上,我该如何传达出针对相似功能存在两种不同模式的原因基本上是没有原因的? 我是否担心下一位开发人员对我的代码的看法?

2
谁设计Web开发中的数据库?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 3年前关闭。 在Web开发的背景下,谁设计数据库?尽管有大量的信息将后端Web开发人员与服务器端处理,数据建模等相关联,但方程式的数据库设计方面似乎并不存在。 我不是在说谁设置物理数据库,而是在说谁设计数据库的逻辑模型,进行用户故事采访以获取有关需要哪些字段,这些字段规范是什么等信息。 。 我已经意识到(PROPER数据库)的设计是不小的任务(我在读这 672寻呼机),并可以很容易地是整个行业。但是,在Internet上上下搜索对于预期在Web开发环境中负责此任务的人员而言,收效甚微。

2
缩小的CSS是否应该存储在Git中?
我使用Gulp从我正在处理的项目的SASS代码中生成缩小的CSS。 我想知道从Git上线时重新生成此缩小的CSS是否被认为是最佳实践... 要么 要将缩小的CSS文件存储在Git中,以便将它们自动实时发布到生产环境,而无需服务器方面的进一步工作? 我很感谢人们对此的想法。谢谢!

2
为什么在Oracle Java教程中将检查与未检查的异常称为“争议”?
我是Java新手,正在阅读有关异常的文档。,尤其是“ 未经检查的异常”-“争议”页面。 底线是: 如果可以合理预期客户端会从异常中恢复,请将其设置为已检查的异常。如果客户端无法采取任何措施来从异常中恢复,请将其设置为未经检查的异常。 我不明白这篇文章。什么是“争议”?你能用简单的话来解释吗?

3
挂钩何时才是正确的设计选择?
我曾经在一个大型的Rails应用程序上工作,在该应用程序中ActiveRecord回调的使用非常猖ramp且令人痛苦。保存记录通常会带来意想不到的副作用,这是对系统进行推理的挑战。 同时,我已经看到钩子作为继承的一部分发挥了很好的作用(例如,使用模板方法的父类允许子类添加专门的行为,而无需了解父内部的内部)。 (例如,在emacs模式被激活时运行钩子,允许用户围绕该模式添加自定义行为)。 我意识到Rails应用程序和Lisp解释器是完全不同的系统,但是我很好奇,当人们决定挂钩是否是解决他们所面临的问题的正确设计选择时,人们是否会参考任何众所周知的标准。 让我大吃一惊的主题是可预测性。钩子的滥用似乎会导致远距离的怪异动作和令人惊讶的行为,而正确使用钩子可能会导致可预测的框架而无需紧密耦合。 由于我还只有几年的编程生涯,因此我在很多方面都认为自己是菜鸟,并且怀疑人们对此主题已经投入了很多思考。什么准则可以指导这一决定?
10 hooks 

1
匹配数百万条记录的部分名称
我们已经开发了一个基于Web的名称匹配应用程序。它通过将名称分成多个部分进行操作,每个部分的Soundex值存储在数据库中。在莱文斯坦距离度量用于应用声音的百分比匹配以及拼写对一个给定的名称。 在运行时,我们将所有记录加载到内存中,并将Levenshtein距离应用于所有Soundex值以及所有名称的所有部分的拼写。 最初这样做很好,因为最多有2万个名称,但是现在我们的一位客户拥有3000万个名称。对于每个请求将巨大的列表加载到内存中并应用这种类型的匹配是一种可悲的方法,它占用了大量内存和执行时间。 我们正在寻找有关在不久的将来搜索声音和拼写百分比匹配的3000万条或更多记录的数据库的建议。 核心功能 最终用户输入要匹配的名称和最小百分比。我们应该在数据库中显示所有名称,其中名称的任何部分与给定名称的任何部分匹配到给定百分比。全名不需要匹配,只要匹配百分比最高就可以成功。例如。 Given Name: Helen Hunt Name in DB: Holly Hunter 两个名称的两个部分都不完全匹配,但在某种程度上不匹配,让我们假设80%,因此,如果用户输入80%,则DB中的名称必须显示为匹配名称。

4
什么时候在Java中使用null语句?
在我一直在寻找一个类的教科书中,有人说,一个语句可以为空(null语句)。null语句仅定义为分号。 它在执行时绝对不执行任何操作。null语句很少使用。 作为一个经验丰富的程序员,我发现有趣的是,他们说很少使用,这暗示着某个地方有用途。 这样的声明可能有什么用?
10 java 

2
创建唯一目的是隐式转换为另一个类的类是否不好?
想象一下一种情况,我们正在使用一个允许您创建Circle对象的库,您可以在其中指定半径和圆心来定义它。但是,由于某些原因,它也需要一个必需的flavour参数。现在,我们确实需要Circle在自己的应用程序中使用,但是出于我的应用程序的目的,我可以将风味设置为Flavours.Cardboard每次。 为了“解决”这一问题,我Circle在另一个命名空间中创建了自己的类,该命名空间仅将radius和center作为参数,但具有一个隐式转换器,可以直接转换为Circle仅创建Circle(this.radius, this.center, Flavours.Cardboard)对象的外部库类。因此,在任何需要其他类型的的地方Circle,我都会进行自动转换。 创建这样一个类的后果是什么?有更好的解决方案吗?如果我的应用程序是在此外部库的基础上构建的供其他程序员使用的API,会有所不同吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.