64位英特尔架构中uint8_t
值的比较比uint32_t
的比较慢吗?特别是在Visual Studio C ++中。
答案 0 :(得分:0)
在我的机器上,它太靠近了:
#include <cstdint>
#include <vector>
#include <random>
#include <iostream>
#include <chrono>
#include <algorithm>
#include <numeric>
template<class T>
std::vector<T> generate_test_data(std::size_t seed)
{
auto v = std::vector<T>(20000000);
std::default_random_engine eng(seed);
std::uniform_int_distribution<T> dist(-127, 127);
std::generate(std::begin(v), std::end(v),
[&eng, &dist] {
return dist(eng);
});
return v;
}
auto inc_if_under_zero = [](int count, auto val) {
return (val < 0) ? count + 1 : count;
};
int main()
{
std::random_device rd;
auto seed = rd();
auto int_data = generate_test_data<std::int32_t>(seed);
auto byte_data = generate_test_data<std::int8_t>(seed);
auto t0 = std::chrono::high_resolution_clock::now();
auto less_zero_32 = std::accumulate(std::begin(int_data),
std::end(int_data),
0,
inc_if_under_zero);
auto t1 = std::chrono::high_resolution_clock::now();
auto less_zero_8 = std::accumulate(std::begin(byte_data),
std::end(byte_data),
0,
inc_if_under_zero);
auto t2 = std::chrono::high_resolution_clock::now();
auto int_time = std::chrono::duration_cast<std::chrono::microseconds>(t1-t0).count();
auto byte_time = std::chrono::duration_cast<std::chrono::microseconds>(t2-t1).count();
std::cout << "totals : " << less_zero_32 << ", " << less_zero_8 << std::endl;
std::cout << "int time : " << int_time << "us" << std::endl;
std::cout << "byte time : " << byte_time << "us" << std::endl;
}
结果与苹果铿锵,-O3:
totals : 9962877, 9962877
int time : 6644us
byte time : 6035us
可能字节时间较少,因为我们必须遍历较少的内存。
答案 1 :(得分:-3)
只有一种方法可以找到 - 编写测试程序并找出答案。
x64架构指令集实际上是一种复杂的语言,在运行时被解释为一系列更简单的指令。 x64指令集非常稳定,但这些更简单的指令因芯片而异。因此,不可能肯定地说结果是否较慢。
在实践中,如果存在明显的差异,我会感到非常惊讶。