基准测试结果奇怪

威利·曼策尔

我编写了以下基准:

#include <iostream> // cout
#include <math.h>   // pow
#include <chrono>   // high_resolution_clock    

using namespace std;
using namespace std::chrono;

int64_t calculate(int);

int main()
{
    high_resolution_clock::time_point t1, t2;

    // Test 1
    t1 = high_resolution_clock::now();
    calculate(200);
    t2 = high_resolution_clock::now();

    cout << "RUNTIME = " <<  duration_cast<nanoseconds>(t2 - t1).count() << " nano seconds" << endl;

    // Test 2   
    t1 = high_resolution_clock::now();
    calculate(200000);
    t2 = high_resolution_clock::now();

    cout << "RUNTIME = " <<  duration_cast<nanoseconds>(t2 - t1).count() << " nano seconds" << endl;
}

int64_t calculate(const int max_exponent)
{
    int64_t num = 0;

    for(int i = 0; i < max_exponent; i++)
    {
        num += pow(2, i);
    }

    return num;
}

在Odroid XU3上运行此基准测试时,将产生以下输出(运行8次):

RUNTIME TEST 1 = 1250 nano seconds
RUNTIME TEST 2 = 1041 nano seconds

RUNTIME TEST 1 = 1292 nano seconds
RUNTIME TEST 2 = 1042 nano seconds

RUNTIME TEST 1 = 1250 nano seconds
RUNTIME TEST 2 = 1083 nano seconds

RUNTIME TEST 1 = 1292 nano seconds
RUNTIME TEST 2 = 1083 nano seconds

RUNTIME TEST 1 = 1209 nano seconds
RUNTIME TEST 2 = 1084 nano seconds

RUNTIME TEST 1 = 1166 nano seconds
RUNTIME TEST 2 = 1083 nano seconds

RUNTIME TEST 1 = 1292 nano seconds
RUNTIME TEST 2 = 1042 nano seconds

RUNTIME TEST 1 = 1166 nano seconds
RUNTIME TEST 2 = 1250 nano seconds

RUNTIME TEST 1 = 1250 nano seconds
RUNTIME TEST 2 = 1250 nano seconds

第二个指数是第一个指数的1000倍。为什么第二通电话有时会更快结束?

我将GCC(4.8)用作带有-Ofast标志的编译器

更新:我可以在我的i7 4770k上重现类似的行为。

杰里·科芬

简短的答案是“消除死代码”。编译器会发现您永远不会使用调用该函数的结果(并且该函数没有副作用),因此它仅消除了调用该函数。

打印出函数的结果,情况会有所变化。例如:

Ignore: -9223372036854775808    RUNTIME = 0 nano seconds
Ignore: -9223372036854775808    RUNTIME = 23001300 nano seconds

修改后的代码,以防万一:

#include <iostream> // cout
#include <math.h>   // pow
#include <chrono>   // high_resolution_clock    

using namespace std;
using namespace std::chrono;

int64_t calculate(int);

int main() {
    high_resolution_clock::time_point t1, t2;

    // Test 1
    t1 = high_resolution_clock::now();
    auto a = calculate(200);
    t2 = high_resolution_clock::now();
    std::cout << "Ignore: " << a << "\t";

    cout << "RUNTIME = " << duration_cast<nanoseconds>(t2 - t1).count() << " nano seconds" << endl;

    // Test 2   
    t1 = high_resolution_clock::now();
    auto b = calculate(200000);
    t2 = high_resolution_clock::now();
    std::cout << "Ignore: " << b << "\t";

    cout << "RUNTIME = " << duration_cast<nanoseconds>(t2 - t1).count() << " nano seconds" << endl;
}

int64_t calculate(const int max_exponent) {
    int64_t num = 0;

    for (int i = 0; i < max_exponent; i++) {
        num += pow(2, i);
    }

    return num;
}

从那里开始,您有一个很小的细节,即您正在溢出int64_t(多次)给出不确定行为的范围-但是至少有了这个,我们有合理的希望打印出来的时间反映执行指定计算的时间。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

访问基准测试结果

来自分类Dev

具有dm完整性的Cryptsetup-奇怪的基准测试结果

来自分类Dev

基准测试结果ForkJoin与Disruptor?

来自分类Dev

出色的SSD基准测试结果

来自分类Dev

深度测试的结果很奇怪

来自分类Dev

在Go中绘制基准测试结果

来自分类Dev

功能速度测试的结果很奇怪

来自分类Dev

Hadoop Terasort不稳定的基准测试结果

来自分类Dev

JMH多个基准测试孤立运行结果不同

来自分类Dev

我的硬盘快要死了吗?(错误的基准测试结果)

来自分类Dev

基准测试结果不确定,需要帮助进行故障排除

来自分类Dev

测试异步方法产生奇怪的结果

来自分类Dev

奇怪的JUnit / Google端点测试结果

来自分类Dev

MATLAB性能基准测试

来自分类Dev

Maven工件基准测试

来自分类Dev

Memcached的UDP基准测试

来自分类Dev

Redis集群基准测试

来自分类Dev

MySQL基准测试

来自分类Dev

Ubuntu资源基准测试

来自分类Dev

Netlogo 基准测试

来自分类Dev

使用Java进行硬盘基准测试,获得不合理的快速结果

来自分类Dev

微基准测试结果检查失败,data.table被引用更改

来自分类Dev

数据库如何在较快的磁盘上具有较差的基准测试结果?

来自分类Dev

为什么Truecrypt和cryptsetup(LUKS)基准测试的结果如此不同?

来自分类Dev

ArrayList和HashSet内存分配奇怪的测试结果

来自分类Dev

C ++和C#速度测试-奇怪的结果

来自分类Dev

Ruby中的基准测试方法

来自分类Dev

Docker和OpenStack基准测试

来自分类Dev

FreeBSD中的MySQLSlap基准测试