我正在对代码中的三个场景进行基准测试,在这些场景中,我希望优化掉一个if语句(该值只在运行时设置一次,然后检查数百万次)。我评估过的三种方法如下
1. A template bool binded at compile time
2. A static bool initialized on first call
3. A bool member variable which gets initialized at construction结果有点不直观,即模板版本花费了相同的时间,但静态成员变量方法更快。有人能解释一下原因吗?
结果(在多次运行时保持一致)
elapsed time: 0.230933 4501s
elapsed time: 0.212918 4501s
elapsed time: 0.230512 4501s示例代码如下
#ifndef TEST_H_
#define TEST_H_
#include <math.h>
#include <iostream>
template<bool Condition>
class Test {
public:
Test() :
signal_(0.0), condition_(false), max_truncation_(12000.00) {
}
~Test() {
}
void CalculateTestingTemplate(double& i);
void CalculateTestingStatic(double& i);
void CalculateTestingMemberVariable(double& i);
private:
double signal_;
double condition_;
double max_truncation_;
};
template<bool Condition>
void Test<Condition>::CalculateTestingTemplate(double& i) {
i++;
if (Condition) {
if (fabs(i) > max_truncation_) {
i = 0;
}
}
if (Condition) {
if (fabs(i) > max_truncation_) {
i = 0;
}
}
if (fabs(i) > max_truncation_) {
i = 0;
}
};
template<bool Condition>
void Test<Condition>::CalculateTestingStatic(double& i) {
i++;
static bool condition = condition_;
if (condition) {
if (fabs(i) > max_truncation_) {
i = 0;
}
}
if (condition) {
if (fabs(i) > max_truncation_) {
i = 0;
}
}
if (fabs(i) > max_truncation_) {
i = 0;
}
};
template<bool Condition>
void Test<Condition>::CalculateTestingMemberVariable(double& i) {
i++;
if (condition_) {
if (fabs(i) > max_truncation_) {
i = 0;
}
}
if (condition_) {
if (fabs(i) > max_truncation_) {
i = 0;
}
}
if (fabs(i) > max_truncation_) {
i = 0;
}
};
#endif // TEST_H_和循环计时的主要函数(-O3)
#include <ctime>
#include <chrono>
#include "test.h"
using namespace std;
int main(int argc, char const *argv[]) {
Test<false>* object = new Test<false>();
int iteration = 90000000;
std::chrono::time_point<std::chrono::system_clock> start, end;
start = std::chrono::system_clock::now();
int i = 0;
double j = 0;
for(; i<iteration;i++)
{
object->CalculateTestingTemplate(j);
}
end = std::chrono::system_clock::now();
std::chrono::duration<double> elapsed_seconds = end - start;
std::cout << "elapsed time: " << elapsed_seconds.count() << " " << j << "s\n";
start = std::chrono::system_clock::now();
i = 0;
j = 0;
for(; i<iteration;i++)
{
object->CalculateTestingStatic(j);
}
end = std::chrono::system_clock::now();
elapsed_seconds = end - start;
std::cout << "elapsed time: " << elapsed_seconds.count() << " " << j << "s\n";
start = std::chrono::system_clock::now();
i = 0;
j = 0;
for(; i<iteration;i++)
{
object->CalculateTestingMemberVariable(j);
}
end = std::chrono::system_clock::now();
elapsed_seconds = end - start;
std::cout << "elapsed time: " << elapsed_seconds.count() << " " << j << "s\n";
return 0;
}发布于 2015-11-29 06:21:50
您的模板测试可能比预期的慢,因为它首先运行,因此遇到缓存未命中,而其他测试不会遇到缓存未命中,因为模板测试已经将数据带入缓存。
https://stackoverflow.com/questions/33817805
复制相似问题