#函数调用为什么那么慢?
我找到两种快速求绝对值的计算方法:
第一种为:
__forceinline int my_abs1(const int& value)
{
return (value ^ (value >> 31)) - (value >> 31);
}
第二种为:
__forceinline int my_abs2(const int& value)
{
return value * (1 - (value >> 31) << 1);
}
测试代码为:
int main()
{
int c = 1000000000;
clock_t start_time = clock();
for (int i = 0; i < c; i++)
{
abs(1);
abs(-1);
}
clock_t end_time = clock();
std::cout << static_cast<double>(end_time - start_time) / CLOCKS_PER_SEC * 1000 << std::endl;
start_time = clock();
for (int i = 0; i < c; i++)
{
my_abs1(1);
my_abs1(-1);
}
end_time = clock();
std::cout << static_cast<double>(end_time - start_time) / CLOCKS_PER_SEC * 1000 << std::endl;
start_time = clock();
for (int i = 0; i < c; i++)
{
my_abs2(1);
my_abs2(-1);
}
end_time = clock();
std::cout << static_cast<double>(end_time - start_time) / CLOCKS_PER_SEC * 1000 << std::endl;
}
结果:9406、11442、11318
最终两种快速运算绝对值的函数反而使用时间更久,于是我直接计算而不调用函数:
int main()
{
int c = 1000000000;
clock_t start_time = clock();
for (int i = 0; i < c; i++)
{
abs(1);
abs(-1);
}
clock_t end_time = clock();
std::cout << static_cast<double>(end_time - start_time) / CLOCKS_PER_SEC * 1000 << std::endl;
start_time = clock();
for (int i = 0; i < c; i++)
{
(1 ^ (1 >> 31)) - (1 >> 31);
(-1 ^ (-1 >> 31)) - (-1 >> 31);
}
end_time = clock();
std::cout << static_cast<double>(end_time - start_time) / CLOCKS_PER_SEC * 1000 << std::endl;
start_time = clock();
for (int i = 0; i < c; i++)
{
1* (1 - (1 >> 31) << 1);
-1* (1 - (-1 >> 31) << 1);
}
end_time = clock();
std::cout << static_cast<double>(end_time - start_time) / CLOCKS_PER_SEC * 1000 << std::endl;
}
结果为:9366、2145、2147。
可以得出这两种方法确实更快,但是第一次测试我使用了__forceinline也使用了引用为实参,为什么会满那么多?而且对比的对象是普通的C++abs函数,都是函数调用,为什么代价这么大?
#我正在寻找最快速的求绝对值方法,是否有int和float的快速求绝对值方法?