Questions tagged «performance»

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

3
在Java 8中使用方法引用语法而不是lambda语法是否会对性能产生好处?
方法引用是否跳过了lambda包装器的开销?他们将来可能吗? 根据有关方法参考的Java教程: 有时... lambda表达式除了调用现有方法外什么也不做。在这种情况下,通常更容易按名称引用现有方法。方法引用使您可以执行此操作;它们是紧凑的,易于阅读的lambda表达式,用于已经具有名称的方法。 由于以下几个原因,我更喜欢lambda语法而不是方法引用语法: Lambda更清晰 尽管有Oracle的主张,但我发现lambda语法比对象方法引用的简写形式更易于阅读,因为方法引用的语法是模棱两可的: Bar::foo 您是否在x的类上调用静态的一参数方法并将其传递给x? x -> Bar.foo(x) 还是在x上调用零参数实例方法? x -> x.foo() 方法参考语法可以代表任何一种。它隐藏了您的代码实际在做什么。 Lambda更安全 如果将Bar :: foo引用为类方法,并且Bar以后添加了同名的实例方法(反之亦然),则代码将不再编译。 您可以始终使用lambda 您可以将任何函数包装在lambda中-因此您可以在所有位置一致地使用相同的语法。方法引用语法不适用于采用或返回原始数组,引发已检查异常或具有与实例和静态方法相同的方法名称的方法(因为该方法引用语法对于调用哪种方法尚不明确) 。当您使用相同数量的参数重载方法时,它们不起作用,但是无论如何您都不应这样做(请参见Josh Bloch的第41项),因此我们不能将其与方法引用相对应。 结论 如果这样做不影响性能,我很想在我的IDE中关闭警告,并始终使用lambda语法,而不会将偶然的方法引用散布到我的代码中。 聚苯乙烯 无论在这里还是那里,但在我的梦中,对象方法引用看起来都更像这样,并且无需lambda包装器就直接在对象上对方法应用invoke-dynamic: _.foo()

10
什么时候“适当的”编程不再重要?
我在业余时间一直在开发一款Android游戏。它使用的是libgdx库,因此为我完成了很多繁重的工作。 在开发过程中,我不小心为某些过程选择了数据类型。我使用哈希表是因为我想要一些接近关联数组的东西。可读键值。在其他地方要实现类似的目的,我使用向量。我知道libgdx具有vector2和vector3类,但是我从未使用过它们。 当我遇到奇怪的问题并在Stack Overflow上寻求帮助时,我看到很多人只是在技术上“合适”另一个问题时就对使用某种数据类型的问题进行了讨论。就像使用ArrayList一样,因为它不需要定义的范围,而与使用新的已知边界重新定义int []一样。甚至像这样琐碎的事情: for(int i = 0; i < items.length; i ++) { // do something } 我知道它每次迭代都会评估item.length。但是,我也知道项目永远不会超过15到20个项目。因此,我是否应该在每次迭代中评估items.length? 我进行了一些测试,以查看应用程序使用我刚刚描述的方法相对于正确方法的性能,并按照教程进行操作,并使用社区建议的确切数据类型。结果:一样。平均45 fps。我打开了手机和银河标签上的每个应用程序。没有不同。 所以我想我对您的问题是:是否不再需要适当的门槛?可以说-“只要完成工作,我不在乎?”

8
为什么NoSQL比SQL快?
最近有人问我: 为什么NoSQL比SQL快? 我不同意这个问题的前提...对于我个人而言这只是胡说八道。通过使用NoSQL而不是SQL,我看不到任何性能提升。也许SQL优于NoSQL,是的,但不是那样。 我是否缺少有关NoSQL的内容?

10
为什么要避免内联脚本编写?
一位知识渊博的朋友最近浏览了我帮助启动的网站,并评论了诸如“非常酷的网站,对源代码中的内联脚本感到羞耻”之类的内容。 我绝对可以删除发生内联脚本的位置;我隐约意识到这是“一件坏事”。我的问题是:内联脚本的真正问题是什么?是否存在重大的性能问题,还是仅是良好风格的问题?当还有其他事情需要处理时,我可以证明对上级的内联脚本方面立即采取行动是合理的吗?如果您打开一个网站并看了一眼源代码,什么因素会导致您说“嗯,在这里从事专业工作”,什么原因会使您从显然业余的工作中退缩? 好的,在写作中那个问题变成了多个问题。但是基本上,内联脚本-有什么关系?

7
在软件编程中,是否可以使CPU和GPU的负载均达到100%?
这是一个关于游戏玩家我感兴趣的主题的普遍问题:CPU / GPU瓶颈和编程。如果我没记错的话,我已经了解到CPU和GPU都可以计算内容,但是由于体系结构的差异,在某些计算中它要比另一种更好。例如,在GPU上破解哈希或进行加密货币挖掘似乎比在CPU上效率更高。 所以我想知道:难道在GPU负载为100%而CPU在50%的情况下运行GPU是不可避免的吗? 或更准确地说:如果第一个计算负载为100%,那么两者通常都达到100%的负载,那么通常由GPU完成的某些计算可以由CPU完成吗? 我已经搜索了一些关于该主题的内容,但是空手而归。我认为并希望它在本小节中有应有的地位,并欢迎您提供给我的任何文档或讲座!

4
Scala与Java相比的性能
首先,我想明确指出,这不是确定哪种语言更好的语言-X-语言-Y的问题。 我已经使用Java很长时间了,我打算继续使用它。与此并行的是,我目前对Scala的学习非常感兴趣:除了一些让我印象深刻的小事情之外,我真的可以很好地使用这种语言。 我的问题是:在执行速度和内存消耗方面,用Scala编写的软件与用Java编写的软件相比如何?当然,通常这是一个很难回答的问题,但是我希望模式匹配,高阶函数等更高层次的结构会带来一些开销。 但是,我目前在Scala的经验仅限于50行以下代码的小示例,并且到目前为止,我还没有运行任何基准测试。因此,我没有真实数据。 如果事实证明Scala 在 Java上确实有一些开销,那么混合使用Scala / Java项目是否有意义,在该项目中,Scala中的较复杂部分和Java中的性能关键部分都可以编码?这是常见的做法吗? 编辑1 我运行了一个小型基准测试:构建一个整数列表,将每个整数乘以2并将其放入新列表中,然后打印结果列表。我编写了一个Java实现(Java 6)和一个Scala实现(Scala 2.9)。我已经在Ubuntu 10.04下的Eclipse Indigo上都运行了。 结果是可比的:Java 480 ms,Scala 493 ms(平均100次迭代)。这是我使用过的片段。 // Java public static void main(String[] args) { long total = 0; final int maxCount = 100; for (int count = 0; count < maxCount; count++) { final long t1 …

19
您会用自己的钱购买硬件以在工作中使用以更好地完成工作吗?[关闭]
在工作中,我得到了合理指定的机器(双四核2GHz,4GB RAM,160GB 7200RPM驱动器,Win7),但是在某些地方(HDD / RAM)缺少。IT人员可以用我自己的硬件代替硬件,所以现在可以使用SSD和额外的8GB RAM(以便可以运行多个Visual Studio和虚拟机)。我意识到选择公司的机器是公司的商业决定,但与此同时,更快的硬件使我更快乐,工作效率更高。 我想我的问题是,我是唯一愿意花个人钱在工作硬件上以改善生活质量的人(个体经营者:),我是否应该以其他方式来对待?是否可以追溯地说:“我认为您应该为这笔$ 500的硬件报销,因为[等等]”?

6
在Web应用程序中DDD聚合真的是一个好主意吗?
我将深入研究领域驱动设计,而我遇到的一些概念从表面上看很有意义,但是当我更多地考虑它们时,我不得不怀疑这是否真的是一个好主意。 例如,聚合的概念很有意义。您可以创建较小的所有权域,这样就不必处理整个域模型。 但是,当我在Web应用程序上下文中考虑此问题时,我们经常访问数据库以拉回小的数据子集。例如,页面可能仅列出订单数量,并带有单击链接以打开订单并查看其订单ID的链接。 如果我理解正确的聚集,我通常会使用存储库模式返回,将包含成员的OrderAggregate GetAll,GetByID,Delete,和Save。好的,听起来不错。但... 如果我调用GetAll列出我所有的订单,那么在我看来,这种模式将需要返回整个汇总信息列表,完整的订单,订单行等...当我只需要该信息的一小部分时(仅标头信息)。 我想念什么吗?还是在这里使用某种程度的优化?我无法想象有人会主张在不需要时返回全部信息。 当然,可以在您的存储库上创建诸如之类的方法GetOrderHeaders,但这似乎违背了首先使用诸如存储库之类的模式的目的。 谁能为我澄清一下? 编辑: 经过大量研究后,我认为这里的脱节之处在于,纯存储库模式与大多数人认为的存储库模式不同。 Fowler将存储库定义为使用集合语义的数据存储,通常存储在内存中。这意味着创建整个对象图。 Evans修改了存储库以包括聚合根,因此截取了存储库以仅支持聚合中的对象。 大多数人似乎将存储库视为美化的数据访问对象,在其中您只是创建获取所需数据的方法。正如Fowler的企业应用程序架构模式中所描述的那样,这似乎并不是目的。 还有一些人认为存储库是一个简单的抽象,主要用于简化测试和模拟,或将持久性与系统的其余部分分离。 我猜答案是,这是一个比我最初想象的要复杂得多的概念。

12
OOP中的文档应避免指定“ getter”是否执行任何计算?
我学校的CS程序避免了任何有关面向对象编程的问题,所以我一直在自己做一些阅读来补充它-特别是Bertrand Meyer的面向对象软件构造。 Meyer反复指出,类应隐藏尽可能多的有关其实现的信息,这是有道理的。特别是,他反复指出,属性(即类的静态,非计算属性)和例程(与函数/过程调用相对应的类的属性)应该是无法区分的。 例如,如果一个类Person具有属性age,他断言,它应该是不可能告诉,从符号,是否Person.age相当于国内喜欢的东西return current_year - self.birth_date或干脆return self.age,其中self.age已被定义为一个常量属性。这对我来说很有意义。但是,他继续声称以下内容: 将设计类的标准客户端文档(称为类的简称),以免透露给定功能是属性还是函数(在可能的情况下)。 即,他声称即使是该类的文档也应避免指定“ getter”是否执行任何计算。 这,我不明白。难道文档不是将这种区别告知用户的重要场所吗?如果我要设计一个包含Person对象的数据库,那么知道是否Person.age是一个昂贵的调用就不重要了,那么我可以决定是否为其实现某种缓存?我是否误解了他的意思,还是他只是OOP设计哲学的一个极端例子?

12
C / C ++的可编译现代替代方案
我正在考虑编写新的软件产品。性能将是至关重要的,因此我对使用一种解释性语言或使用仿真层的语言(阅读Java)保持警惕。 这使我想到了使用C(或C ++)的想法,但是它们都相当长。我很久没用了。我认为在过去的20年中,有人可能创建了相当流行的东西,可以很好地编码和编译。 有什么比C更现代的替代方法来编写高性能的已编译代码? 如果说C ++与15年前是不同的野兽,我会考虑一下,我想我假设它有一些固有的问题。 并行化很重要,但可能不会跨多台计算机。

6
是什么使应用程序具有可伸缩性?
我在职位发布中不断看到,申请人必须具有编写“可扩展”应用程序的经验。是什么使应用程序具有可伸缩性?我如何知道我的代码可以扩展到数百万个用户? 我想表达这个问题的一种更好的方法是:如何在编写代码时考虑可伸缩性?这样一来,代码就可以从一开始就进行扩展,而不是事后才想到。是否有某些设计方法?还是仅仅是为工作选择正确的算法?



1
btree和rtree索引有什么区别?
我在MySQLWorkbench上注意到,您可以在进行工程前设计之前选择如何存储索引。存储类型为: BTREE 实时树 杂凑 经过研究,我发现了一些非常重要的信息,因此我正在寻找有关这些信息之间的区别和/或为什么应该选择一个而不是另一个的实用信息。 另外,我以前从未选择过存储类型,因此我假设MySQL正在选择默认存储类型(BTREE?)

12
编写代码方法论的逐渐转变是否会影响系统性能?我应该在乎吗?
TD; DR: 关于我在问的问题有些困惑,所以这是问题背后的驱动思想: 我一直希望这个问题是什么。我本来可能说得不太好。但是其意图一直是“ 模块化,分离,松散耦合,解耦,重构的代码 ”,其本质明显比“ 整体式单一单元,在一个地方完成所有工作,一个文件,紧密耦合的 ”代码慢。剩下的只是我当时或现在或以后会遇到的细节和各种表现形式。在某种程度上,它肯定较慢。就像无碎片磁盘一样,您必须从任何地方拾起碎片。慢一点 当然。但是我应该在乎吗? 问题不在于... 与微优化,过早优化等无关。这与“优化这一部分或死亡”无关。 之后怎么样了? 它涉及随着时间而出现的有关编写代码的总体方法,技术和思考方式: “将此代码作为依赖项注入到您的类中” “每个班级写一个文件” “将视图与数据库,控制器,域分开”。 不要编写意大利面同质的单个代码块,而是编写可以协同工作的许多单独的模块化组件 它是关于在十年内当前在大多数框架中看到和倡导的代码的方式和样式,这些框架是在大会上倡导的,并且是通过社区传播的。这是思维方式从“整体块”到“微服务”的转变。随之而来的是机器级别的性能和开销,以及一些程序员级别的开销。 原始问题如下: 在计算机科学领域,我注意到编程方面的思维方式发生了显着变化。我经常遇到这样的建议: 编写较小的函数式代码(这种方式更具可测试性和可维护性) 将现有代码重构为越来越小的代码块,直到大多数方法/函数只有几行长并且很清楚它们的目的是什么(与更大的整体块相比,它创建了更多函数) 编写只做一件事的函数-关注点分离等(通常会在堆栈上创建更多函数和更多帧) 创建更多文件(每个文件一个类,用于分解目的的更多类,用于诸如MVC,域架构,设计模式,OO等层的目的,这会创建更多文件系统调用) 与“旧”或“过时”或“意大利面条”编码实践相比,这是一个变化,在常规编码实践中,您的方法跨越2500行,并且大型类和上帝对象可以完成所有工作。 我的问题是这样的: 当涉及到机器代码,1和0,汇编指令以及HDD盘片时,我应该完全担心我的类完全分离的OO代码以及各种重构的小型函数和方法也会生成额外的开销? 细节 尽管我对ASM到底如何处理OO代码及其方法调用以及DB调用和编译器调用如何转换为在HDD磁盘上移动执行器臂的方式并不太熟悉,但我确实有一些想法。我假设每个额外的函数调用,对象调用或“ #include”调用(在某些语言中)都会生成一组额外的指令,从而增加代码量并增加各种“代码接线”开销,而无需添加实际的“有用”代码。我还认为可以在ASM实际上在硬件上运行之前对其进行良好的优化,但是优化也只能做很多事情。 因此,我的问题是-与“包含一个大方法,其中包含一个大方法一切都放在一个整体文件中”,由于这种开销? 为清楚起见,更新: 我假设采用相同的代码并将其拆分,重构,解耦为越来越多的函数,对象以及方法和类将导致越来越多的参数在较小的代码段之间传递。因为可以肯定的是,重构代码必须保持线程运行,并且这需要传递参数。与单个整体类或方法相比,更多的方法,更多的类或更多的Factory Method设计模式导致传递更多信息位的开销更大。 有人说(引用待定),所有代码中多达70%是由ASM的MOV指令组成的-向CPU寄存器加载适当的变量,而不是进行实际的计算。就我而言,您可以使用PUSH / POP指令来加载CPU时间,以提供各种代码之间的链接和参数传递。您编写的代码段越小,所需的“链接”开销就越大。我担心这种联系会增加软件的膨胀和减慢速度,我想知道我是否应该关注这一点,以及是否要关注(如果有的话),因为现在和将来的下一代程序员都在为下个世纪构建软件,则必须使用和使用使用这些做法构建的软件。 更新:多个文件 我现在正在编写新代码,正在逐渐替换旧代码。特别是我注意到旧的类之一是〜3000行文件(如前所述)。现在,它已成为位于各个目录中的15-20个文件的集合,包括测试文件,不包括我用来将某些东西绑定在一起的PHP框架。还有更多文件。对于磁盘I / O,加载多个文件比加载一个大文件要慢。当然,并非所有文件都已加载,它们是根据需要加载的,并且存在磁盘缓存和内存缓存选项,但我仍然相信,这loading multiple files需要比loading a single file内存更多的处理工作。我将其添加到我的关注中。 更新:依赖注入所有内容 过一会儿再说。我认为我的问题被误解了。也许我选择误解了一些答案。我并不是在谈论微优化,因为一些答案已经被挑出来了(至少我认为我所说的关于微优化的说法是用词不当),而是整体上“重构代码以放松紧密耦合”的动向。 ,在代码的每个级别。我是最近从Zend Con来的,这种风格的代码一直是公约的核心和核心内容之一。从视图中解耦逻辑,从模型中解脱视图,从数据库中解脱模型,并且如果可能的话,从数据库中解耦数据。依赖-注入所有内容,有时意味着只添加什么都不做的接线代码(函数,类,样板),但可以用作接缝/勾点,在大多数情况下,很容易使代码大小加倍。 …

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.