Questions tagged «performance»

对于与代码的度量或改进以及应用程序效率有关的问题。

7
为什么在x64 Java中long比int慢?
我在Surface Pro 2平板电脑上运行带有Java 7更新45 x64(未安装32位Java)的Windows 8.1 x64。 当i的类型为long时,下面的代码花费1688ms,而当i的类型为int时,下面的代码花费109ms。为什么长(64位类型)比具有64位JVM的64位平台上的int慢一个数量级? 我唯一的猜测是,与64位整数相比,CPU需要更长的时间来添加32位整数,但这似乎不太可能。我怀疑Haswell不会使用纹波加法器。 我正在Eclipse Kepler SR1中运行它,顺便说一句。 public class Main { private static long i = Integer.MAX_VALUE; public static void main(String[] args) { System.out.println("Starting the loop"); long startTime = System.currentTimeMillis(); while(!decrementAndCheck()){ } long endTime = System.currentTimeMillis(); System.out.println("Finished the loop in " + (endTime - startTime) …

8
我如何优化MySQL的ORDER BY RAND()函数?
我想优化查询,以便进行调查mysql-slow.log。 我的大多数慢查询都包含ORDER BY RAND()。我找不到解决此问题的真正解决方案。MySQLPerformanceBlog有一个可能的解决方案,但我认为这还不够。在优化不佳(或频繁更新,用户管理)的表上,该表不起作用,或者我需要运行两个或多个查询才能选择PHP生成的随机行。 这个问题有解决方案吗? 一个虚拟的例子: SELECT accomodation.ac_id, accomodation.ac_status, accomodation.ac_name, accomodation.ac_status, accomodation.ac_images FROM accomodation, accomodation_category WHERE accomodation.ac_status != 'draft' AND accomodation.ac_category = accomodation_category.acat_id AND accomodation_category.acat_slug != 'vendeglatohely' AND ac_images != 'b:0;' ORDER BY RAND() LIMIT 1

6
使用map.get()时使用Java Map.containsKey()冗余
我一直想知道,在最佳实践中,是否允许不使用containsKey()on方法java.util.Map,而是对from的结果进行空检查get()。 我的理由是,对值进行两次查找似乎是多余的:首先对进行查找,containsKey()然后对进行查找get()。 另一方面,可能是大多数标准实现都Map缓存了最后的查找,或者编译器可以通过其他方式消除冗余,并且对于代码的可读性而言,最好保留该containsKey()部分。 非常感谢您的评论。

16
将许多参数传递给方法的最佳实践?
有时,我们必须编写接收许多参数的方法,例如: public void doSomething(Object objA , Object objectB ,Date date1 ,Date date2 ,String str1 ,String str2 ) { } 遇到此类问题时,我经常将参数封装到映射中。 Map<Object,Object> params = new HashMap<Object,Object>(); params.put("objA",ObjA) ; ...... public void doSomething(Map<Object,Object> params) { // extracting params Object objA = (Object)params.get("objA"); ...... } 这不是一个好习惯,将参数封装到地图中完全是浪费效率。好的是,干净的签名,易于以最少的修改添加其他参数。解决此类问题的最佳实践是什么?

3
从OFFSET / FETCH NEXT获取总行数
因此,我有一个函数,该函数返回一些要在我的网站上实现分页的记录。建议我使用SQL Server 2012中的Offset / Fetch Next来完成此任务。在我们的网站上,我们有一个区域,列出了记录总数以及您当时所在的页面。 以前,我获得了整个记录集,并能够以编程方式建立分页。但是,仅将SQL方法与FETCH NEXT X ROWS一起使用,我只得到X行,所以我不知道我的总记录集是什么以及如何计算我的最小和最大页面。我能做到的唯一方法是两次调用该函数,并在第一个函数上进行行计数,然后使用FETCH NEXT运行第二个函数。有没有一种更好的方法可以让我不再运行查询两次?我正在尝试提高性能,而不是降低性能。

3
原子操作成本
原子操作(比较和交换或原子加/减的任何操作)的成本是多少?它消耗多少个周期?它会暂停SMP或NUMA上的其他处理器,还是会阻止内存访问?它将刷新乱序CPU中的重排序缓冲区吗? 缓存会受到什么影响? 我对流行的现代CPU感兴趣:x86,x86_64,PowerPC,SPARC,Itanium。

8
Python比C ++更快更轻吗?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 我一直认为Python的优势在于代码的可读性和开发速度,但是时间和内存使用却不如C ++。 这些统计数据让我非常震惊。 您的经验告诉您关于Python与C ++的时间和内存使用情况?

6
与其他类型的循环相比,编译器会为do-while循环产生更好的代码吗?
zlib压缩库中有一条注释(Chromium项目中使用了它),这意味着在大多数编译器中,C语言中的do-while循环会生成“更好的”代码。这是它所在的代码段。 do { } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && scan < strend); /* The funny "do {}" generates better code on most compilers */ https://code.google.com/p/chromium/codesearch#chromium/src/third_party/zlib/deflate.c&l=1225 是否有证据表明大多数(或任何一种)编译器会生成更好(例如,效率更高)的代码? 更新: 原始作者之一Mark Adler在评论中提供了一些上下文。

19
Google怎么能这么快?
已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 哪些技术和编程决策可以使Google如此快速地提供查询服务? 每次我搜索某项内容(每天几次)时,总是让我惊讶,它们在不到1秒的时间内还是如何提供结果。他们可以采用哪种配置和算法来实现这一目标? 旁注:有点让人不知所措,即使我要放置一个桌面应用程序并在我的计算机上使用它也可能不会比Google快一半。我说继续学习。 以下是一些不错的答案和提供的指导: Google平台 地图缩小 精心设计的算法 硬件-集群场和大量廉价计算机 缓存和负载平衡 Google文件系统

4
为什么memmove比memcpy快?
我正在研究某个应用程序中的性能热点,该应用程序将其50%的时间都花在memmove(3)上。该应用程序将数百万个4字节的整数插入已排序的数组中,并使用memmove将数据“右移”,以便为插入的值腾出空间。 我的期望是复制内存的速度非常快,而令我惊讶的是花了这么多时间在记忆体上。但是后来我想到memmove速度很慢,因为它移动的是重叠区域,必须在一个紧密的循环中实现它,而不是复制大内存页。我写了一个小型的微基准测试,以找出memcpy和memmove之间的性能差异,期望memcpy能够胜任。 我在两台机器(核心i5,核心i7)上运行了基准测试,发现memmove实际上比memcpy快,在较旧的i7核心上甚至快两倍。现在,我正在寻找解释。 这是我的基准。它使用memcpy复制100 mb,然后使用memmove复制大约100 mb;源和目标重叠。尝试了源和目的地的各种“距离”。每次测试运行10次,平均时间被打印出来。 https://gist.github.com/cruppstahl/78a57cdf937bca3d062c 以下是Core i5(Linux 3.5.0-54-通用#81〜precise1-Ubuntu SMP x86_64 GNU / Linux)上的结果,gcc为4.6.3(Ubuntu / Linaro 4.6.3-1ubuntu5)。括号中的数字为源与目标之间的距离(间隙大小): memcpy 0.0140074 memmove (002) 0.0106168 memmove (004) 0.01065 memmove (008) 0.0107917 memmove (016) 0.0107319 memmove (032) 0.0106724 memmove (064) 0.0106821 memmove (128) 0.0110633 Memmove被实现为SSE优化的汇编代码,从后到前复制。它使用硬件预取将数据加载到缓存中,然后将128个字节复制到XMM寄存器中,然后将其存储在目标位置。 (memcpy-ssse3-back.S,行1650 ff) L(gobble_ll_loop): prefetchnta -0x1c0(%rsi) prefetchnta -0x280(%rsi) prefetchnta …
89 c++  c  performance  memory 


12
使用匿名函数会影响性能吗?
我一直想知道,在Javascript中使用命名函数和匿名函数之间是否存在性能差异? for (var i = 0; i < 1000; ++i) { myObjects[i].onMyEvent = function() { // do something }; } 与 function myEventHandler() { // do something } for (var i = 0; i < 1000; ++i) { myObjects[i].onMyEvent = myEventHandler; } 第一个是比较整洁的,因为它不会因很少使用的函数而使您的代码混乱,但是多次重声明该函数是否重要呢?


4
Java使用数组的速度是C ++中std :: vector的8倍。我做错什么了?
我有以下带有几个大数组的Java代码,这些数组永远不会改变其大小。它在我的计算机上运行1100毫秒。 我在C ++中实现了相同的代码并使用了std::vector。 在我的计算机上,运行完全相同的代码的C ++实现的时间为8800 ms。我做错了什么,所以运行缓慢? 基本上,代码执行以下操作: for (int i = 0; i < numberOfCells; ++i) { h[i] = h[i] + 1; floodedCells[i] = !floodedCells[i]; floodedCellsTimeInterval[i] = !floodedCellsTimeInterval[i]; qInflow[i] = qInflow[i] + 1; } 它遍历大小约为20000的不同数组。 您可以在以下链接下找到这两种实现: Java:https://ideone.com/R8KqjT C ++:https://ideone.com/Lu7RpE (由于时间限制,在ideone上,我只能运行400次而不是2000次循环。但是即使在这里,相差三倍)


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.