سلام.
داشتم این پست و نتایج عجیبش رو نگاه میکردم. و واقعا واسم جالب بود که توی تست Performance ها Java رتبه ی ۱ تا ۴ رو داشت Go رتبه ی ۵ تا ۶ رو داشت LuaJit رتبه ی ۷ و C++/C رتبه ی ۹ و ۸ و Assembly رتبه ی ۱۰ رو داشت. واقعا همچین چیزی با عقل جور در نیومد واسم. واسه همینم تصمیم گرفتم کد ++C و LuaJit رو خودم تست کنم ببینم که نکنه این یارو از خودش در آورده اینارو.
نتیجه ی تستم خیلی عجیب بود. برنامه کامپایل شده با ++C توی ۲۸ ثانیه اجرا شد. و در همین حال برنامه ی اجرا شده با LuaJit توی ۱۲ ثانیه اجرا شد. و واقعا تعجب کردم !! خلاصه به این نتیجه رسیدم که JIT Compiler ها کد ها رو Optimize میکنن و به خاطر همینه که همچین نتیجه ای حاصل شده.
واسه همین تصمیم گرفتم کد ++C رو با فلگ O3- بصورت بهینه کامپایل کنم. و دوباره نتیجه ی خیلی عجیب تری گرفتم . توی این تست، زمان اجرای کد رو با تابع ()clock اندازه گیری کردم. و این نتیجه ی این تست بود :
زمان اجرای کد کامپایل شده بدون O3- شد : 28864174 واحد زمانی clock_t
زمان احرای کد کامپایل شده با O3- شد : 2 واحد زمانی clock_t
این اختلاف خیلی خیلی زیادیه !! این نتایج قدرت فلگ های O1- و O2- و O3- کامپایلر GCC رو واقعا نشون میدن .به نظرتون چیا این وسط تغییر کردن که همچین اختلاف زمانی بزرگی رو ایجاد کردن ؟؟ آیا مشکلی هم پیش اومده ؟؟ فکر میکنم خوب باشه درموردش بحثی بشه
این کد ++C :
#include <iostream>
#include <time.h>
#include <sys/time.h>
using namespace std;
int main(int argc, char** argv)
{
clock_t s,e;
s = clock();
size_t i_loop1 = 0;
size_t i_loop2 = 0;
size_t i_loop3 = 0;
size_t i_counter = 0;
for (i_loop1 = 0; i_loop1 < 10; i_loop1++) {
for (i_loop2 = 0; i_loop2 < 32000; i_loop2++) {
for (i_loop3 = 0; i_loop3 < 32000; i_loop3++) {
i_counter++;
}
}
if(i_counter > 50)
i_counter = 0;
}
e = clock();
cout<<"End time : "<< e-s<<endl;;
cout<<"i_counter : "<< i_counter<<endl;;
return 0;
}
این کد Lua :
#!/bin/env lua
i_counter = 0
local i_time_start = os.clock()
for i_loop1=1,10 do
for i_loop2=1,32000 do
for i_loop3=1,32000 do
i_counter = i_counter + 1
end
end
end
local i_time_end = os.clock()
print(i_counter)
print(string.format("Total seconds: %.2f\n", i_time_end - i_time_start))
local s = 0
for s = 1,10 do
print(s)
s = s + 1
end