首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >奇怪的基准结果

奇怪的基准结果
EN

Stack Overflow用户
提问于 2016-01-01 16:24:27
回答 2查看 103关注 0票数 1

我编写了以下基准:

代码语言:javascript
运行
复制
#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次运行):

代码语言:javascript
运行
复制
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 4770 K上复制类似的行为。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-01 17:11:21

简单的回答是“死代码消除”。编译器看到您从未使用调用函数的结果(而且该函数没有副作用),因此它只是消除了对函数的调用。

打印出函数的结果,就会发生一些变化。例如:

代码语言:javascript
运行
复制
Ignore: -9223372036854775808    RUNTIME = 0 nano seconds
Ignore: -9223372036854775808    RUNTIME = 23001300 nano seconds

如果您关心的话,修改代码:

代码语言:javascript
运行
复制
#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的范围(多次超过),给出了未定义的行为--但是至少有理由希望打印出来的时间反映了执行指定计算的时间。

票数 6
EN

Stack Overflow用户

发布于 2016-01-01 16:50:16

这可能是在CPU缓存的帮助下发生的,或者,很可能是编译器的优化。尝试使用-O0禁用优化并比较结果。我在我的机器上重复了一遍,有和没有"-O0“,得到了完全不同的结果。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34557817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档