c++中对于以下两种赋值方式,那种效率更高呢?
第一种:array[i] = N;
第二种:*(array+i)=N;
请大家帮忙解答一下,万分感谢。
个人认为没区别呢
好像第二种效率更高一些。
我是在项目中测的,跑的代码的主要工作就是数组赋值,测试数据类型是int32,数据量分别是4k,64k,1M,2M,8M和128M个数据,对于每个数量级每种赋值方式分别测试了7次。将赋值方式由第一种改为第二种后,对于1M,2M,8M和128M数据量的测试,代码运行时间可以直接看出有所减少,但减少程度不大。比如对于128M数据量的测试,第一种赋值方式用时大概率分布在584800us---586200us之间(没有计算平均时间),第二种赋值方式用时大概率分布在582400us---584400us之间(7次测试中只有一次用时超过了584400us)。
当然了,以上只是在项目中的测试,并不严谨。
测试代码:
#include <chrono>
#include <iostream>
using namespace std;
int main() {
int* array1 = new int[100000000];
int* array2 = new int[100000000];
auto start_time = std::chrono::steady_clock::now();
for (int i = 0; i < 100000000; i++) {
array1[i] = 1;
}
auto code_1_time = std::chrono::steady_clock::now();
for (int i = 0; i < 100000000; i++) {
*(array2 + i) = 1;
}
auto code_2_time = std::chrono::steady_clock::now();
cout << "code_1_time:" << std::chrono::duration<double, std::micro>(code_1_time - start_time).count() << "us" << endl;
cout << "code_2_time:" << std::chrono::duration<double, std::micro>(code_2_time - code_1_time).count() << "us" << endl;
return 0;
}
说明:在我的测试环境VS 2017中,总是第一个for循环的时间比第二个for循环的执行时间要长,将两个for循环中的赋值语句调换后,也是大概率第一个for循环的时间比第二个for循环的执行时间要长,甚至for循环中没有代码时,只是进行循环,第一个for循环的时间也总比第二个for循环的时间要长。
结论:两种方式性能相近,至少在这么多重循环中,它们产生的性能差距都无法抵消系统产生的时间不均误差。盲猜是编译器将两种方式编译成了相同的指令。