Tag: 性能

我如何编码的Java允许使用SSE和边界检查消除(或其他高级优化)?

情况: 我正在优化LZF压缩algorithm的纯Java实现,它涉及到大量的byte []访问和基本的intmath,用于哈希和比较。 性能真的很重要,因为压缩的目标是减lessI / O需求。 我不张贴代码,因为它尚未清理,并可能会重组。 问题: 我怎样才能编写我的代码,以允许它使用更快的SSE操作JIT编译为表单? 我怎样才能构造它,使编译器可以轻松消除数组边界检查? 是否有关于特定math运算相对速度的广泛参考(需要多less增量/减量才能达到正常的加/减,移位速度有多快?还是与数组访问有多快? 我怎样才能优化分支 – 有更多的条件陈述短身体,或一些长期的,或短嵌套条件? 使用当前的1.6 JVM,在System.arraycopy击败复制循环之前必须复制多less个元素? 我已经做了什么: 在我受到过早优化攻击之前:基本algorithm已经非常优秀,但是Java的实现速度还不到C的速度的2/3。我已经用System.arraycopyreplace了复制循环,并且优化了循环,并且删除了un需要的操作。 我大量地使用bit来转换和填充字节来performance性能,以及转换和屏蔽。 出于法律方面的原因,我不能看类似库中的实现,而现有的库有太多限制的许可条款可供使用。 良好(接受)答案的要求: 不可接受的答案: “这是更快”没有解释多less和为什么,OR还没有用JIT编译器testing过。 边界线答案:在Hotspot 1.4之前没有经过任何testing 基本的答案:将提供一个通用的规则和解释,为什么它在编译器级别更快,并且大概快了多less 很好的答案:包括几个代码示例来演示 优秀的答案:有JRE 1.5和1.6的基准 完美的答案:是由HotSpot编译器工作的人员,可以完全解释或引用要使用的优化的条件,以及它通常的速度。 可能包括由HotSpot生成的Java代码和样例汇编代码。 另外:如果有人有详细的热点优化和分支性能的内涵的链接,欢迎。 我对字节码有足够的了解,即一个分析字节码而不是源代码级别的性能的站点会有所帮助。 (编辑)部分答案:Bounds-Check Ellimination: 这是从提供的链接到HotSpot内部维基: https : //wikis.oracle.com/display/HotSpotInternals/RangeCheckElimination 在以下情况下,HotSpot将消除所有for循环中的边界检查: 数组是循环不变的(不在循环内重新分配) 索引variables有一个不断的步幅(按照常量增加/减less,如果可能的话,只有一个点) 数组由variables的线性函数索引。 例如: int val = array[index*2 + 5] OR: int val = array[index+9 […]

Swift的性能:map()和reduce()vs for循环

我在Swift中编写了一些性能关键的代码。 在实现了我所能想到的所有优化之后,并在Instruments中分析应用程序之后,我意识到绝大多数CPU周期都花在对Floats数组执行map()和reduce()操作上。 所以,为了看看会发生什么,我将所有的map实例都replace成了旧的for循环。 令我惊讶的是, for循环要快得多! 有点困惑,我决定执行一些粗糙的基准。 在一个testing中,在执​​行一些简单的算术之后,我有map返回一个Float数组: // Populate array with 1,000,000,000 random numbers var array = [Float](count: 1_000_000_000, repeatedValue: 0) for i in 0..<array.count { array[i] = Float(random()) } let start = NSDate() // Construct a new array, with each element from the original multiplied by 5 let output = array.map({ (element) -> Float […]

是否有对10000客户端/秒问题的解决scheme进行现代审查

(通常称为C10K问题) 是否有一个更现代的c10k问题的解决scheme的审查(最后更新:2006年9月2日),专门针对Linux(epoll,signalfd,eventfd,timerfd ..)和像libev或libevent的库? 讨论所有在现代Linux服务器上解决和仍然没有解决的问题?

ReSharper呆滞

我喜欢ReSharper,但它是一个完整的记忆猪。 它可以快速地膨胀起来,消耗一​​半的RAM,没有太多的努力,陷入IDE。 有谁知道有什么办法来configuration它不是很慢?

像'%Query%'和全文searchCONTAINS查询的性能

我有一个情况,我想search一个单词 。 对于这种情况,从性能angular度来看哪个查询是好的? Select Col1, Col2 from Table Where Col1 Like '%Search%' 要么 Select Col1, Col2 from Table Where Col1 CONTAINS(Col1,'Search') ?

为什么GoLang解决scheme比同等的Java解决scheme更快?

最近在工作中,我们玩弄了IBM提出的以下测验问题https://www.research.ibm.com/haifa/ponderthis/challenges/May2015.html 经过一番努力,一位同事和我已经到了两个解决scheme,一个在GoLang https://gist.github.com/walesey/e2427c28a859c4f7bc920c9af2858492#file-main-go-L57 ,另一个在Java https:// gist。 github.com/boyter/42df7f203c0932e37980f7974c017ec5#file-puzzle-java-L63与在Java中的playGames和GoLang中的游戏(都在上面链接)中的性能关键方法。 Go程序几乎是Java的一个文本副本,但其运行时间约为6秒,而Java程序约为26秒(在本地机器上)。 Go程序的速度大约快了5倍,在其他一些机器上也复制了类似的数字。 Go程序是使用1.7.5版本和Java 1.8.0_65版本在MacOS Sierra 10.12.3上运行的,后者在2013年末的视网膜MacBook Pro上搭配2.6GHz i5 CPU。 为什么Go程序比Java程序快5倍,当大多数基准testing都表明Java应该运行在同一个运行时? 这只是一个循环中的基本math,所以它似乎应该在同一时间运行。 对于JVM的启动时间,我可以理解大概一秒左右,但是这似乎没有关系。 两个程序几乎都使用相同的循环。 游戏结果的所有可能的排列被创build并迭代每个开始的金额。 看起来,对于围绕Java运行的Go循环中的任何循环操作而言,似乎都是如此。 我知道这是一个“微观”基准testing,但是我想知道为什么Go代码大大优于Java代码。 只是简单的循环/math是更有效的,因此更快? 它能否展开循环(虽然这似乎不太可能产生如此巨大的差异)? 如果不是,你应该如何构build一个Java程序来获得最简单的循环和math运算的性能? 编辑 – 感谢Dolda2000我已经修改了Java版本。 现在和GoLang版本的速度差不多。 事实上,问题在于游戏的创build导致Java版本必须模拟更多游戏来确定游戏是否足够长。 随着这些变化,现在运行了大约6秒钟,并恢复了我对Java的信心。 更新 – 这是一个扩展的文章 ,进一步详细讨论了这个问题的背景。

sql组通过与独特

当查询中没有完成聚合时,为什么有人会使用一个组而不使用一个组? 另外,有人知道在MySQL和SQL Server中,不同的性能考虑。 我猜SQL Server有一个更好的优化器,他们可能接近于同等的地位,但在MySQL中,我期望明显的性能优势。 我对dba的答案感兴趣。 编辑: 比尔的post很有趣,但不适用。 让我更具体的… select a, b, c from table x group by a, b,c 与 select distinct a,b,c from table x

提高WPF UI渲染速度的方法

如果WPF应用程序的屏幕包含很多原始控件,则其渲染变得缓慢。 在这种情况下,除了增加更less的控件和使用更强大的video卡之外,还有哪些build议的方法可以提高WPF应用程序的响应速度? 有没有办法以某种方式使用屏幕外缓冲或类似的东西?

newInstance与新的jdk-9 / jdk-8和jmh

我在这里看到很multithreading比较并试图回答哪个更快: newInstance或new operator 。 看源代码,似乎newInstance应该慢得多 ,我的意思是它做了这么多的安全检查并使用reflection。 我决定先测量一下,首先运行jdk-8。 这里是使用jmh的代码。 @BenchmarkMode(value = { Mode.AverageTime, Mode.SingleShotTime }) @Warmup(iterations = 5, time = 2, timeUnit = TimeUnit.SECONDS) @Measurement(iterations = 5, time = 2, timeUnit = TimeUnit.SECONDS) @State(Scope.Benchmark) public class TestNewObject { public static void main(String[] args) throws RunnerException { Options opt = new OptionsBuilder().include(TestNewObject.class.getSimpleName()).build(); new Runner(opt).run(); } @Fork(1) @Benchmark […]

For-loop性能:将数组长度存储在variables中

考虑相同循环迭代的两个版本: for (var i = 0; i < nodes.length; i++) { … } 和 var len = nodes.length; for (var i = 0; i < len; i++) { … } 后者的版本是否比前者更快?