Khi muốn đo tốc độ chạy chương trình, thì đầu tiên cần phải loại bỏ hết những yếu tố có thể ảnh hưởng đến tốc độ chương trình:
- Đầu tiên là mảng arr không làm gì --> compiler có thể optimize bỏ luôn đoạn code này.
- Đoạn code này chạy quá nhanh --> không thể đo chính xác thời gian chạy. Ít nhất phải chạy vòng for lớn gấp 100 lần như vậy
- Độ lớn của mảng arr là lũy thừa của 2 --> có thể ảnh hưởng đến cache của bộ nhớ, do hàm hash của cache dùng dịch bit. Cái này thường sẽ ảnh hưởng đến mảng >= 2 chiều, nhưng tốt nhất là thông thường ko nên để mảng có độ lớn là lũy thừa 2.
Sau khi sửa 3 cái này thì mình thu được code ở dưới, tốc độ chạy 2 vòng for lệch nhau khoảng 6 lần. Vẫn không được 16, nhưng có thể là do còn những cái mà mình chưa biết :)
#include <iostream>
#include <ctime>
#define size (64 * 1024 * 1024 + 11LL)
using namespace std;
int arr[size];
int main(){
for(int i = 0; i < size; ++i)
arr[i] = rand() % 10;
const clock_t begin_time = clock();
long long size_100 = size * 100LL;
for (long long i = 0; i < size_100; i++) arr[i % size] *= 3;
for (long long i = 0; i < size_100; i += 16) arr[i % size] *= 3;
std::cout << float( clock () - begin_time ) / CLOCKS_PER_SEC << endl;
long long sum = 0;
for(int i = 0; i < size; ++i) sum += arr[i];
cout << sum << endl;
}