测试编译器对于指针迭代和下标迭代是否生成相同的代码。
#include <iostream>
#include <time.h> // For clock()
#include <stddef.h> // For size_t
#include <string.h> // For memcpy()
void copy_with_pointers(char const *src, char *dst,
size_t n) {
for (size_t k = 0; k!=n; ++k)
*dst++ = *src++;
}
void copy_with_indices(char const *src, char *dst,
size_t n) {
for (size_t k = 0; k!=n; ++k)
dst[k] = src[k];
}
int main() {
int const n_bytes = 100000;
int const n_calls = 100;
char *src = new char[n_bytes];
char *dst = new char[n_bytes];
// Reduce paging effects by accessing all bytes:
memcpy(dst, src, n_bytes);
clock_t start, end, reftime; // transform %s to div CLOCKS_PER_SEC
// Test 1 (reference time)
start = clock();//
for (int k = 0; k!=n_calls; ++k)
memcpy(dst, src, n_bytes);
end = clock();
reftime = end-start;
std::cout << end - start << std::endl;
// Test 2 (pointers)
start = clock();
for (int k = 0; k!=n_calls; ++k)
copy_with_pointers(src, dst, n_bytes);
end = clock();
std::cout << end - start << std::endl;
std::cout << "With pointers: "
<< static_cast<double>(end-start)/reftime
<< " times slower than memcpy.\n";
// Test 3 (indices)
start = clock();
for (int k = 0; k!=n_calls; ++k)
copy_with_indices(src, dst, n_bytes);
end = clock();
std::cout << end - start << std::endl;
std::cout << "With indices: "
<< static_cast<double>(end-start)/reftime
<< " times slower than memcpy.\n";
delete[] src;
delete[] dst;
return 0;
}
代码详解:
clock_t start, end;
start = clock();
/* code */
end = clcok();
times = end - start; //单位是clock_t(CPU时钟数) ,转换为秒 需要除以CLOCKS_PER_SEC