多項式運算效能比對

2021-09-06 14:16:14 字數 3010 閱讀 1556

有原始按照每次項相乘的方式來計算和使用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 裡 實現的並不優秀,但應該很穩 霧 全部提...