TA的每日心情 | 奋斗 5 天前 |
|---|
签到天数: 1184 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 # Z' d& q4 ?: J+ F8 w; L( y. s$ n
" @7 N) { G3 ^; l+ |1 R3 z理了理思路,重新做了一个测试。
2 J) T3 [' i/ Z3 t5 k做了两个 vector 和 两个 float *, 都长 100000
0 G* Z0 L* f, ~/ G4 m外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
4 v# ?2 U! M, Y2 H o7 D$ p5 i) {. F7 ]* Y* |* Y+ S
内循环试了4种方法,7 V: Q2 l; [" ^
1. 直接调用 vector inner_product 247s " k1 P: W2 \# _* `2 }
2. vector 循环点乘累加 237s
e* W( e4 Q2 t+ f: F v2 _" n3. float * 循环点乘累加 204s
4 F& ^& ?" O* B' X) `4. 空循环 100000 次 202s
, \0 r% f& e8 H9 v" B X& z) R4 [
9 {5 e; ]& S2 O# a+ a不做内循环 200s: F4 f4 E& I! I4 Q9 ?
0 ?6 Q/ d# K( R8 |: D- ?# H
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
6 C# t6 S5 K$ q% H1 i另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
1 h0 f$ ^6 U* @( j w |- u% g5 e' h; a3 S! F3 L7 s+ e
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
1 n S% P0 M! E; \9 |% p( z& p$ k3 R3 G0 O/ i
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)) d R, d/ t5 ^
& w3 n: t0 {) p! H
std::vector < float > vec1(N);
& Y+ F4 }1 I! ~ std::vector < float > vec2(N);# Z y9 |; f, g: Z
float* b1 = new float[N];
6 j' w8 g8 ?6 u7 o5 S% Y& X float* b2 = new float[N];
, C' Z' l2 N7 }5 J
7 E; ^* R5 y4 p* F8 m: E- q3 L/ z for (int j = 0; j < 6000; j++)/ m. a+ @9 {' K$ X
{: A2 E* s! y' f- s3 L5 w
std::generate(vec1.begin(), vec1.end(), []() {
( ?- C _. w" C" l" t# t return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
/ a& r; M8 A. M* M& U });) N4 [' N; L, |. W
7 ]1 p+ r4 G; M std::generate(vec2.begin(), vec2.end(), []() {
9 C6 V/ D7 a0 X _. I7 W( L. a return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
! m7 C+ }8 b+ V- m- | });- w) e' Q+ V V# R% V2 [
% E/ n6 M5 E4 h3 G for (size_t jj = 0; jj < vec1.size(); jj++)
6 k7 }' I6 }. J- [* i' ] {% ?7 {* p; ~" I3 A" ^* e4 @
b1[jj] = vec1[jj];
" W' ?4 K$ L7 ?4 `1 ~& Z4 B! j }0 u8 U0 B/ G) R" C. f/ r4 h- B5 f0 g
2 o% l: M" s1 H# E
for (size_t jj = 0; jj < vec2.size(); jj++)
; B: ]" B( M& L0 e {
( L% m$ P; S' M: |* i3 Z b2[jj] = vec2[jj];
; Q, Q$ R) A5 h. w6 a }
$ i* W; Q ?7 o" W1 x# U" R8 L- a' H/ q
//Method - 1 N=100000 247s
$ A# `, E. ?, X, N; U' U& N //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
, Q7 W$ a1 n0 |8 ~8 p
5 E+ Y" X V P# l! P$ O //Method - 2 N=100000 237s5 T/ T D9 s2 Q2 E, r6 V) C, n+ v, `
/*" |8 P# Z" ?9 z2 s8 V9 e A
for (int jj = 0; jj < N ; jj++)9 h5 l3 }; p* n) R5 B
{1 H+ Z! T" R/ Z
fresult += vec1[jj] * vec2[jj];
' j5 k6 N3 r5 m }4 p+ c; Y6 U8 [3 V" d( ~& f
*/2 W0 D+ v8 N' E2 S. L4 M: Y a! j
$ t% n; V) Y4 F1 |' ^+ A0 ]) F5 a //Method - 3 N=100000 204s) q9 O+ ^7 q( z+ O% u9 u: X
/*
. j# _: i6 [: c; U( c for (int jj = 0; jj < N; jj++)
: d% y' O6 b" g J0 \; M# U( d* ~ {
. ?8 K6 h' x" e3 o fresult += b1[jj] * b2[jj];
4 ?3 D1 Q0 A* V% ^; V% Q }# d- p6 x3 X2 ?9 m" w3 j" {
*/7 Q- L, A; [- ~& ^' q: Z/ W
- X: z/ E% o" f' ~# ~8 t" Y
//Method - 4 202s
3 R7 K- K% E0 w+ s1 s0 G9 T. u) v /*
- Z9 W7 T, p& ~6 M% `5 H0 K% [# Y for (int jj = 0; jj < N; jj++)* H6 d6 K9 z6 N1 _& y6 `
{
- ]( x, Z! U# _9 ]" s1 D3 Q # l3 z( W6 o# m4 G' a/ K: x8 Q& s
}
; l+ W- s- i* v */9 j4 @% l4 L9 v" r1 g
//comment out all methods, N=100000 202s , u6 a: v* u" @/ O( Y [
}# b9 @1 l5 x z4 l5 J
$ N( _# A; Q' h. [8 B$ `7 r
delete []b1;
/ S1 N4 R$ E3 U6 j) q delete []b2;
: G# r( y2 _9 O/ x: @3 B( m |
|