有原始按照每次項相乘的方式來計算和使用horner方法進行多項式求和運算;
使用原始計算方法,**如下:
double poly_original(double *a, double x, long degree)
return result;
}使用horner 方法計算方法和**如下:
公式為:
**如下:
double poly_horner(double *a, double x, long degree)
return result;
}比較這兩個方法的效能,我們直覺上會發現,原始的方法的乘法運算的數量是第二種方法的兩倍,因此,按理說,第一種方法應該要慢很多才對,實際上,第一種方法執行的速度還是要快一些。
它們的objdump彙編**如下:黃色是每次迴圈執行的**
原始計算方法:
000000000040077d <_z13poly_originalpddl>:
40077d: f2 0f 10 17 movsd (%rdi),%xmm2
400781: 48 85 f6 test %rsi,%rsi
400784: 7e 23 jle 4007a9 <_z13poly_originalpddl>
400786: 66 0f 28 c8 movapd %xmm0,%xmm1
40078a: b8 01 00 00 00 mov $0x1,%eax
40078f: 66 0f 28 d9 movapd %xmm1,%xmm3
400793: f2 0f 59 1c c7 mulsd (%rdi,%rax,8),%xmm3
400798: f2 0f 58 d3 addsd %xmm3,%xmm2
40079c: f2 0f 59 c8 mulsd %xmm0,%xmm1
4007a0: 48 83 c0 01 add $0x1,%rax
4007a4: 48 39 c6 cmp %rax,%rsi
4007a7: 7d e6 jge 40078f <_z13poly_originalpddl>
4007a9: 66 0f 28 c2 movapd %xmm2,%xmm0
4007ad: c3 retq
從上面的**分析,關鍵資料路徑是mulsd (%rdi,%rax,8),%xmm3和addsd %xmm3,%xmm2,而mulsd %xmm0,%xmm1、add $0x1,%rax,cmp %rax,%rsi, movapd %xmm1,%xmm3,都可以在它執行的期間完成。
horner方法:
00000000004007ae <_z11poly_hornerpddl>:
4007ae: f2 0f 10 0c f7 movsd (%rdi,%rsi,8),%xmm1
4007b3: 48 83 ee 01 sub $0x1,%rsi
4007b7: 78 13 js 4007cc <_z11poly_hornerpddl>
4007b9: f2 0f 59 c8 mulsd %xmm0,%xmm1
4007bd: f2 0f 58 0c f7 addsd (%rdi,%rsi,8),%xmm1
4007c2: 48 83 ee 01 sub $0x1,%rsi
4007c6: 48 83 fe ff cmp $0xffffffffffffffff,%rsi
4007ca: 75 ed jne 4007b9 <_z11poly_hornerpddl>
4007cc: 66 0f 28 c1 movapd %xmm1,%xmm0
4007d0: c3 retq
從上面的**分析,關鍵資料路徑是mulsd %xmm0,%xmm1和addsd (%rdi,%rsi,8),%xmm1。
因此,從上面看,它們的效能應該是等同的才對。
下面是我的測量資料:
root@opzoon-all-series:/data_1/songqing/for_test/keydatapath# ./a.out
keydatapath.cpp(66): original cost 25776997 microsecond
keydatapath.cpp(76): horner cost 27069789 microsecond
root@opzoon-all-series:/data_1/songqing/for_test/keydatapath# ./a.out
keydatapath.cpp(66): original cost 25915710 microsecond
keydatapath.cpp(76): horner cost 26932413 microsecond
root@opzoon-all-series:/data_1/songqing/for_test/keydatapath# ./a.out
keydatapath.cpp(66): original cost 25804754 microsecond
keydatapath.cpp(76): horner cost 27919597 microsecond
但是,為什麼原始方法會稍微快一點呢???
多項式運算
多項式運算 順序棧實現 在demo1.cpp基礎上增加 彌補異常處理 以及多位數運算缺點 include include include define ok 1 define error 2 define overflow 1 define ini size 100 typedef int elem...
VC多項式運算
多項式運算主要是係數和指數的處理,本文用乙個簡單的例子實現該功能。首先,新建控制台應用程式 然後,新建類 標頭檔案 polynomial.h inte ce for the cpolynomial class.if defined afx polynomial h 06b9bccd 1789 483...
多項式運算封裝
update on 21.12.30 新增了polyeva 修補了polymod處多測時可能產生的 bug。update on 22.2.7 重 寫 前一版太醜了 改為完全封裝版本 使用std vector存放多項式係數,運算在命名空間polynomial 裡 實現的並不優秀,但應該很穩 霧 全部提...