Questions tagged «performance»

与提高应用程序性能有关的问题可能涉及从选择软件体系结构到算法选择的范围。

9
如何处理关于“过早优化是万恶之源”的误解?
我遇到了很多人,他们在原则上反对任何在英语中通常被认为是“优化”的东西,他们经常逐字引用(部分)引用“过早的优化是万恶之源”。作为他们立场的理由,暗示他们将我所说的一切解释为“过早的优化”。但是,这些视图有时是如此可笑地根深蒂固,以至于它们几乎消除了任何与最纯粹的“天真的”实现方式有关的算法或数据结构偏差……或者至少与它们之前的工作方式无关。在听到“性能”或“优化”的消息后,人们如何才能像这样使人们再次“张开耳朵”?我该如何讨论对性能有影响的设计/实现主题,而又不会让人立即想到:“这个人想花两周时间来编写十行代码?” 现在,在这里以及在Web的其他角落已经讨论了 “是否所有优化都是过早的并因此有害的”的立场,并且已经讨论了如何识别优化何时过早并因此有害的立场,但是不幸的是,现实世界中仍有一些人不愿意挑战自己对反优化的信念。 以前的尝试 几次,我试图提供Donald Knuth的完整报价,以解释“过早的优化是不好的”↛“所有的优化都是不好的”: 我们应该忘记效率低下的问题,例如大约97%的时间:过早的优化是万恶之源。然而,我们不应放弃我们那临界的3%的机会。 但是,在提供完整报价时,这些人有时有时会变得更加确信我在做的是Premature Optimization™,并深入研究并拒绝听。好像“优化”一词使他们感到害怕:在某些情况下,我能够通过避免使用“优化(e | ation)”一词来提出实际的性能改进代码更改,而不会被否决。和“性能”(这个词也很吓人),而是使用“替代架构”或“改进的实现”之类的表达方式。因此,这似乎真的是教条主义,而不是他们实际上是对我的批评进行评估,然后视其为不必要和/或过于昂贵而将其驳回。

2
Python(和其他动态语言)的哪些语义特征导致其缓慢?
我不太了解Python。我试图更精确地了解动态语言(如Python,Lua,Scheme,Perl,Ruby等)的确切功能正迫使他们的实现变慢。 作为一个例子,Lua 5.3的可继承机制会直观地使Lua变得很慢,但实际上有传言说Lua相当快(并且比Python快)。 另外,我有直觉(可能是错误的),由于目前的处理器内存大于原始计算慢得多(与高速缓存未命中的存储器访问需要的同时,数以百计的算术运算),动态类型检查(点菜if (value->type != INTEGER_TAG) return;的C语言)可以运行得很快。 当然,随着翻译程序的快速运行,整个程序分析(例如Stalin Scheme实现的工作)可以使动态语言实现成为可能,但是让我们假设我没有时间先设计整个程序分析器。 (我在MELT监视器中设计了一种动态语言,其中有些会翻译成C语言)

5
多个数据库访问还是一个大规模访问?
关于性能和最佳资源利用的更好方法是:通过AJAX多次访问数据库以仅在需要时获取所需的确切信息,或者执行一次访问以检索包含所有可能需要的信息的对象。,很有可能实际上并不需要全部吗? 我知道如何对实际查询进行基准测试,但是当成千上万的用户同时访问数据库时,我不知道如何测试数据库性能方面的最佳选择,以及连接池如何发挥作用。
25 performance  sql 

6
为什么LMAX的团队为什么要使用Java并设计架构以避免不惜一切代价避免GC?
为什么LMAX的团队为什么要用Java 设计LMAX Disruptor,但所有设计都着眼于最大限度地减少GC使用?如果不想运行GC,那么为什么要使用垃圾回收语言? 他们的优化,硬件知识水平和他们的想法都很棒,但是为什么要使用Java? 我不反对Java或其他任何东西,但是为什么要使用GC语言?为什么不使用不带GC的D之类的语言或其他语言却允许高效的代码呢?是团队最熟悉Java还是Java拥有我没有看到的某些独特优势? 假设他们使用带有手动内存管理功能的D进行开发,会有什么区别?他们将不得不考虑低级(他们已经是),但是他们可以从系统本身中榨取最佳性能。

4
面向数据的设计-不超过1-2个结构“成员”不切实际?
数据导向设计的常见示例是Ball结构: struct Ball { float Radius; float XYZ[3]; }; 然后他们提出了一种迭代std::vector<Ball>向量的算法。 然后它们给您同样的东西,但是在面向数据的设计中实现: struct Balls { std::vector<float> Radiuses; std::vector<XYZ[3]> XYZs; }; 这样做很好,而且如果您要先迭代所有半径,然后遍历所有位置,依次类推,那么一切都很好。但是,如何移动矢量中的球?在原始版本中,如果您有std::vector<Ball> BallsAll,则可以将任何移动BallsAll[x]到任何一个BallsAll[y]。 但是,对于面向数据的版本,要对每个属性执行相同的操作(对于Ball,则必须执行两次(半径和位置)。但是,如果您拥有更多的属性,情况会变得更糟。您必须为每个“球”保留一个索引,并且在尝试移动它时,必须在每个属性向量中进行移动。 这不会破坏面向数据设计的任何性能优势吗?

4
与将字符串连接在一起并一次调用相比,经常调用println()有多糟糕?
该问题是从Code Review Stack Exchange 迁移而来的,因为可以在Software Engineering Stack Exchange上回答。 迁移 5年前。 我知道输出到控制台是一项昂贵的操作。出于代码可读性的考虑,有时最好调用一个函数两次输出文本,而不是将一长串文本作为参数。 例如,效率降低多少 System.out.println("Good morning."); System.out.println("Please enter your name"); 与 System.out.println("Good morning.\nPlease enter your name"); 在该示例中,区别仅在于一个呼叫,println()如果更多,该怎么办? 与此相关的是,如果要打印的文本很长,则在查看源代码时,涉及打印文本的语句可能看起来很奇怪。假设文本本身不能简短,该怎么办?是否应该出现多次println()通话的情况?曾经有人告诉我,代码行不应超过80个字符(IIRC),那么您将如何处理 System.out.println("Good morning everyone. I am here today to present you with a very, very lengthy sentence in order to prove a point about how …
23 java  c++  performance  c  io 

4
如何显着提高Java性能?
LMAX团队进行了有关如何在不到1毫秒的延迟时间内完成100k TPS的演示。他们通过博客,技术论文(PDF)和源代码本身来备份该演示文稿。 最近,马丁·福勒(Martin Fowler)发表了一篇有关LMAX架构的出色论文,并提到他们现在每秒能够处理600万个订单,并着重介绍了该团队为提高性能而采取的一些步骤。 到目前为止,我已经解释了业务逻辑处理器速度的关键是在内存中按顺序进行所有操作。这样做(并没有真正愚蠢的事情)允许开发人员编写可处理10K TPS的代码。 然后,他们发现专注于良好代码的简单元素可以将其带入100K TPS范围。这只需要精心构造的代码和小的方法-本质上,这使Hotspot可以更好地进行优化,并使CPU在运行代码时更高效地缓存代码。 提升另一个数量级需要更多的技巧。LMAX团队发现有几件有助于实现目标的方法。一种是编写Java集合的自定义实现,这些实现被设计为对缓存友好并且谨慎处理垃圾。 达到最高性能水平的另一种技术是将注意力放在性能测试上。长期以来,我一直注意到人们在谈论提高性能的技术,但是真正起作用的一件事就是对其进行测试 福勒提到发现了几件事情,但他只提到了几件。 是否还有其他架构,库,技术或“事物”有助于达到这样的性能水平?

7
软件腐烂主要是指性能还是凌乱的代码?
维基百科对软件腐烂的定义集中在软件的性能上。这与我习惯的用法不同。在代码的整洁和设计方面,我想的更多,在代码具有所有标准质量特征(可读性,可维护性等)方面。现在,当代码变得不可读时,性能可能会下降,因为没人知道发生了什么。但是术语“软件腐烂”是否对性能有特别的提及?还是我认为它是指代码的整洁性对吗?或者这可能是该术语在多种意义上被普遍使用的情况-从用户的角度来看,这与性能有关;但是对于软件工匠而言,它必须更专门地处理代码的读取方式?

10
如何避免“开发人员的不良优化直觉”?
我在一篇发表以下声明的文章上看到: 开发人员喜欢合理地优化代码。它是如此令人满意和有趣。但是,知道何时进行优化更为重要。不幸的是,开发人员通常对应用程序中的性能问题的实际位置有着可怕的直觉。 开发人员如何避免这种直觉?是否有好的工具来查找您的代码的哪些部分真正需要优化(对于Java)?您是否知道有关该主题的一些文章,技巧或精彩读物?
22 java  performance 

11
低延迟代码有时是否必须“丑陋”?
(这主要是针对那些对低延迟系统有特定知识的人,以避免人们只是用没有根据的意见来回答)。 您是否觉得在编写“好的”面向对象的代码与编写非常快速的低延迟代码之间需要权衡?例如,避免在C ++中使用虚函数/多态性的开销等-重写看上去很讨厌但很快的代码等? 这是有道理的-谁在乎它是否看起来丑陋(只要它可以维护)-如果您需要速度,就需要速度吗? 我很想听听在这些领域工作过的人的来信。
21 java  c++  c  performance  latency 

16
您使用什么简单的技术来提高性能?
我说的是我们编写简单例程的方式,目的是在不使您的代码更难阅读的情况下提高性能,例如,这是我们学习到的典型方法: for(int i = 0; i < collection.length(); i++ ){ // stuff here } 但是,我通常在a foreach不适用的情况下执行此操作: for(int i = 0, j = collection.length(); i < j; i++ ){ // stuff here } 我认为这是一种更好的方法,因为它只会调用length一次该方法……我的女友说这虽然很神秘。您还可以在自己的开发中使用其他任何简单的技巧吗?

6
通常,是否值得使用虚拟函数来避免分支?
似乎粗略地等效于指令,等同于分支未命中虚拟函数的代价具有类似的权衡: 指令与数据缓存未命中 优化障碍 如果您看到类似: if (x==1) { p->do1(); } else if (x==2) { p->do2(); } else if (x==3) { p->do3(); } ... 您可能具有成员函数数组,或者如果许多函数都依赖于同一分类,或者存在更复杂的分类,请使用虚函数: p->do() 但是,总的来说,虚拟函数和分支的代价是多少?很难在足够多的平台上进行测试以进行泛化,所以我想知道是否有人有一个粗略的经验法则(可爱if的是,断点只有4 s吗?) 总的来说,虚拟功能更加清晰,我倾向于它们。但是,我有几个非常关键的部分,可以在其中将代码从虚函数更改为分支。在进行此操作之前,我希望对此有所考虑。(这不是微不足道的更改,也不是易于在多个平台上进行测试)
21 c++  performance 

10
在开发的开始或结束时,什么时候更好地优化软件以获得更好的性能?
我是一名初级软件开发人员,我想知道什么时候是优化软件以提高性能(速度)的最佳时机。 假设该软件不是非常庞大且难以管理,是花更多的时间在开始对其进行优化上还是我应该只是开发能够正确执行所有功能的软件,然后继续对其进行优化以获得更好的性能?

2
如何在保持效率的同时将用户界面与业务逻辑分开?
假设我想显示一个表示组合框上10个不同对象的表单。例如,我希望用户从10个不同的包含番茄的汉堡包中选择一个。 因为我想分离UI和逻辑,所以我必须通过表单来表示汉堡包的字符串,以便在组合框中显示它们。否则,UI必须深入到对象字段。然后,用户将从组合框中选择一个汉堡包,并将其提交回控制器。现在,控制器将不得不根据表单使用的字符串表示形式(也许是ID?)再次查找所述汉堡包。 这不是效率低下吗?您已经有了想要从中选择一个的对象。如果您将整个对象提交给表单,然后返回一个特定的对象,则以后不必重新引用它,因为表单已经返回了对该对象的引用。 而且,如果我错了,而您实际上应该将整个对象发送到表单,那么如何将UI与逻辑隔离?

3
为什么将计算表示为矩阵乘法会使运算速度更快?
在Google 使用TensorFlow的MNist教程中,展示了一种计算,其中一个步骤等效于将矩阵乘以矢量。Google首先显示一张图片,其中将完整写出执行计算所需的每个数字乘法和加法。接下来,他们显示了一张图片,其中将其表示为矩阵乘法,声称此版本的计算更快,或者至少可能更快: 如果将其写为方程式,则得到: 我们可以“向量化”此过程,将其转换为矩阵乘法和向量加法。这有助于提高计算效率。(这也是一种有用的思考方式。) 我知道这样的方程式通常是由机器学习从业人员以矩阵乘法格式编写的,并且从代码简洁性或理解数学的角度来看,当然可以看出这样做的好处。我不明白的是Google声称从手写形式转换为矩阵形式“有助于提高计算效率” 通过将计算表示为矩阵乘法,何时,为什么以及如何在软件中获得性能改进?如果我作为一个人本人要在第二张(基于矩阵)图像中计算矩阵乘法,则可以通过依次执行第一张(标量)图像中所示的每个不同的计算来完成。对我来说,它们只是两个表示同一计算序列的符号。为什么我的计算机与众不同?为什么计算机能够比标量计算机更快地执行矩阵计算?

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.