如果你想填充 100 个(甚至 1000 个)unsigned int
元素,那么你可以选择任何你想要的方法,无论是它std::fill_n
,还是for
循环 - 数量太小你不会看到差异,即使你经常做这个操作。
但是,如果您想为更大的数组设置值,例如 8k x 8k 纹理,其像素由 4 个无符号颜色分量组成,那么您可以使用以下方法的简短比较:
#include <iostream>
#include <ctime>
#include <cstdint>
int main(){
long unsigned const size = 8192 * 8192 * 4;
unsigned* arr = new unsigned[size];
clock_t t1 = clock();
memset(arr, 0, size*sizeof(unsigned));
clock_t t2 = clock();
std::fill_n(arr, size, 123);
clock_t t3 = clock();
for(int i = 0; i < size; ++i)
*(arr + i) = 123;
clock_t t4 = clock();
int64_t val = 123;
val = val << 32 | 132;
for(int i = 0; i < size / 2; ++i)
*(int64_t*)(arr + i * 2) = val;
clock_t t5 = clock();
std::cout << "memset = " << t2 - t1 << std::endl;
std::cout << "std::fill_n = " << t3 - t2 << std::endl;
std::cout << "for 32 = " << t4 - t3 << std::endl;
std::cout << "for 64 = " << t5 - t4 << std::endl;
delete arr;
return 0;
}
1.memset
与其他方法相比,此函数仅用于向您展示您的数组归零速度有多快。这是最快的解决方案,但仅当您想将每个字节设置为相同的值时才可用(我猜对您的情况特别有用0
)0xFF
。
2.std::fill_n
并for
以 32 位值循环
std::fill_n
看起来是最慢的解决方案,甚至比32 位值的解决方案还要慢一些。for
3.for
在 64 位系统上使用 64 位值循环
我想这是您可以寻求的解决方案,因为它赢得了这场比赛。但是,如果您的机器是 32 位的,那么我希望结果与具有 32 位值的循环相当(取决于编译器和处理器),因为处理器会将一个 64 位值作为两个 32 位处理价值观。