这是一段看似非常特殊的C++代码.出于某种奇怪的原因,奇迹般地对数据进行排序使得代码几乎快了六倍.
#include <algorithm>
#include <ctime>
#include <iostream>
int main()
{
// Generate data
const unsigned arraySize = 32768;
int data[arraySize];
for (unsigned c = 0; c < arraySize; ++c)
data[c] = std::rand() % 256;
// !!! With this, the next loop runs faster.
std::sort(data, data + arraySize);
// Test
clock_t start = clock();
long long sum = 0;
for (unsigned i = 0; i < 100000; ++i)
{
// Primary loop
for (unsigned c = 0; c < arraySize; ++c) …Run Code Online (Sandbox Code Playgroud) 我一直在玩Java 8 Streams - API,我决定使用microbenchmark stream()和parallelStream()stream.正如预期的parallelStream()那样,速度提高了两倍,但是其他东西弹出 - 如果我在将数据传递给filter它之前对数据进行排序,结果需要花费5-8倍的时间,filter->map->collect而不是传递未排序的列表.
(Stream) Elapsed time [ns] : 53733996 (53 ms)
(ParallelStream) Elapsed time [ns] : 25901907 (25 ms)
Run Code Online (Sandbox Code Playgroud)
(Stream) Elapsed time [ns] : 336976149 (336 ms)
(ParallelStream) Elapsed time [ns] : 204781387 (204 ms)
Run Code Online (Sandbox Code Playgroud)
package com.github.svetlinzarev.playground.javalang.lambda;
import static java.lang.Long.valueOf;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
import com.github.svetlinzarev.playground.util.time.Stopwatch;
public class MyFirstLambda {
private static final int ELEMENTS = 1024 * …Run Code Online (Sandbox Code Playgroud) 现代CPU被优化,以便访问和修改存储器中的相同位置(时间局部性)以及存储器中的连续位置(空间局部性)是非常快速的操作.
现在,由于Haskell是一种纯粹的不可变语言,你自然不能覆盖现有的内存块,可能使得foldl比for具有连续访问的结果变量的循环慢得多的事情将在C中.
Haskell是否在内部做任何事情来减轻这种性能损失?一般来说,它的地方性质是什么?