底层的CPU优化对我们的应用有影响。此外,它们证明了大多数程序员的错觉是错误的。是的,你使用的是高级语言。但这并不意味着所有这些抽象层都能完全屏蔽CPU。我在一个Java程序上演示了CPU缓存的效果。
CPU的发展速度比主存快得多。如今,CPU大部分时间都在等待。现代CPU可以在每个CPU周期执行多条指令。但如果它必须访问主内存,绕过三个缓存中的每一个,它必须等待大约100个周期。
Java中的逃逸分析
自Java6以来,JVM使用了一种完全惊人的优化技术来减少内存占用。有趣的是,围绕这项技术有很多城市神话。他们说逃逸分析是一种将内存从堆转移到堆栈的工具。这是胡说八道,但这是有趣的胡说八道,所以我将在本文中介绍这个想法。
事实证明,逃逸分析并不是一种优化技术。它“只是”一个分析工具,可以进行有趣的优化。Escape analysis检查变量,查看其使用位置,并检测其是否在特定范围外使用。如果它没有超出这个范围,我们知道它是一个局部变量,我们可以更仔细地检查它。仅在有限范围内使用的变量允许进行许多优化。
锁省略
这些优化之一是锁省略。你有没有遇到过多个线程访问一个公共变量的问题?如果是这样的话,您可能会用一个同步块来包围程序的许多部分。有时你甚至不得不这么做,因为你不知道你的方法将如何被使用。 StringBuffer
实现的一个经典示例。StringBuffer的方法经常使用 synchronized
,以防万一:
public synchronized int length() { return count; }
事实是,几乎每个应用程序都以单线程方式使用 StringBuffer
。换句话说,获取锁并保护 StringB