这可能是一个悬而未决的问题,但是我将从斯卡拉语言开始。 Scala支持异步编程。在scala的未来是ExecutionContext,我们可以考虑使用forkJoinPool的任务或ThreadPool的线程。这意味着不同上下文中的某些代码实际上在同一线程中执行,但是在同一调用堆栈中,代码将被分解为不同的线程。众所周知,现代CPU都具有L1 / L2 / L3缓存,如果代码可以利用L1 / L2 / L3缓存,则将比从主内存读取速度更快。但是,由于异步编程,相同的上下文将在不同的线程中,线程可能/可能不在同一进程中执行,因此代码无法在不同的Future中使用缓存,现在的问题是异步编程可以通过以下方式更有效地执行代码:将长调用分成几部分,但是从CPU缓存中读取代码会带来好处。是好是坏,还是我的理解是完全错误的。
答案 0 :(得分:2)
您是正确的,对于本论坛来说,这个范围太广了,但是这里有一些评论。
如果代码分成较小的部分,则执行效率会更高。尽管这样做确实允许更多的并行性,但这样做总是效率较低,因此可以在多核处理器上更快地执行。将代码分解为线程的主要原因是为了减少延迟,并允许程序的不同部分独立运行以更好地分离问题。在访问速度较慢的设备时,它还可以提高性能,但是无论如何,这大部分都是由操作系统来解决的。
您对在内核之间移动线程的潜在成本是正确的,但是调度程序非常了解高速缓存性能问题,并将在可能的情况下将线程保持在同一内核或内核组上(同样,这取决于处理器和处理器)。内存架构)。
您提到从高速缓存中读取代码,但是通常是数据访问给高速缓存和内存系统带来最大压力。这是功能代码可以提供帮助的一个领域,因为它确实可以从内存的一个部分读取并写入另一部分,这通常比读写内存的相同部分更为有效。
Scala程序无法直接“利用”缓存,除非您对有关处理器的了解不多,否则尝试尝试是很危险的。即使您设法使代码在一个处理器上表现特别出色,也不太可能在不同的处理器上,特别是在不同的体系结构上很好地工作。
与所有这些类型的问题一样,有一些基本规则将使代码或多或少地有效运行,但是性能优化应该非常仔细地进行,并且应集中在被证明对代码至关重要的代码领域。程序的性能。