- 論壇徽章:
- 0
|
本帖最后由 amos613 于 2011-01-29 10:15 編輯
傳統(tǒng)的c/c++編譯器為GNU的gcc/g++,當(dāng)然我們也通常使用gcc/g++來編譯MySQL。但是有研究指出gcc/g++編譯器對c/c++優(yōu)化在某些方面做的并不好。Intel針對自己的處理器特點(diǎn)發(fā)布了編譯器icc。本文希望使用icc編譯得到MySQL,然后通過測試得到icc編譯出的MySQL在性能等方面的特點(diǎn)。
1測試環(huán)境
1.1使用icc編譯器編譯MySQL5.0
在configure前需要通過CC,CXX等變量改變編譯器為icc。具體命令如下:
CC=icc CXX=icpc CFLAGS="-O3 -unroll2 -no-gcc –restrict -fPIC" CXXFLAGS="-O3 -unroll2 -no-gcc –restrict -fPIC" ./configure ……
上述需要注意的是-fPIC參數(shù),如果不添加這個參數(shù),編譯過程中會出現(xiàn)“could not read symbols:bad value”錯誤。
1.2使用icc編譯器編譯MySQL5.1
在編譯mysql5.1時(shí),除了像編譯5.0那樣修改CC,CXX參數(shù)外,還需要修改mysql5.1(5.1.40)mysys/stacktrace.c中的代碼,以避免編譯過程中出現(xiàn)重定義錯誤。該錯誤是由于icc編譯器和gcc編譯支持的代碼特性不同引起的。
char __attribute__ ((weak)) *
my_demangle(const char *mangled_name __attribute__((unused)),
int *status __attribute__((unused)))
{
return NULL;
}
改為:
#if defined(__INTEL_COMPILER)
#pragma weak my_demangle=my_demangle_null
char *my_demangle_null(const char *mangled_name, int *status)
{
return NULL;
}
#else
char __attribute__ ((weak)) *my_demangle(const char *mangled_name, int *status)
{
return NULL;
}
#endif /* !__INTEL_COMPILER */
1.3測試機(jī)器及環(huán)境
測試機(jī)有4顆CPU,16G內(nèi)存。Icc編譯的mysql和gcc編譯的mysql同時(shí)安裝在這臺機(jī)器上,以避免由于機(jī)器差異而引起的性能差異。兩個mysql的配置文件是相同的,以避免cache等參數(shù)的不同,引起的性能差異。
2正確性測試方法及結(jié)果
2.1正確性測試方法
本節(jié)是驗(yàn)證icc編譯的mysql在程序邏輯和行為上的正確性。測試方法是選取某數(shù)據(jù)庫的數(shù)據(jù)和兩條典型SQL,分別在icc編譯的mysql和gcc編譯的mysql上執(zhí)行。對比它們的輸出來驗(yàn)證:icc編譯的mysql執(zhí)行結(jié)果是否和gcc編譯的mysql的執(zhí)行結(jié)果一致。測試包含對InnoDB和MyISAM兩種引擎的分別測試。測試使用的兩個SQL:
SQL1:select * from tb_customer where urldomain like "%.net" and status=3;
SQL2:update tb_customer set cust_prov=20 where pose_id=178;
針對SQL2,在執(zhí)行完SQL2后,使用“select cust_prov from tb_customer where pose_id=178;”觀察輸出來驗(yàn)證SQL2執(zhí)行的正確性。
2.2正確性測試結(jié)果
下表中的數(shù)據(jù)是相關(guān)測試結(jié)果:
因?yàn)殚L度受限:http://hi.baidu.com/ops_bd/blog/item/c2e2f9496f25ccd9d0c86a59.html |
|