TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 9 H" w1 T' [9 `( C4 T
. { B/ s' F s+ Y$ x' e9 J理了理思路,重新做了一个测试。6 Y! J6 f; l: K% |; h
做了两个 vector 和 两个 float *, 都长 100000
7 q3 q5 O9 x5 p外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
& x/ Y3 G2 L3 L1 Q5 y$ K: u! {- i1 Z9 T
内循环试了4种方法,
9 a. d; \8 Z2 G8 v1 P4 k4 _2 q1. 直接调用 vector inner_product 247s
5 a' @7 w5 d2 s0 [, r7 g( v. ]2. vector 循环点乘累加 237s
% ~* r. P$ J' U! y% n! b! I. ]& k3. float * 循环点乘累加 204s5 v; [$ E' O. y4 y* d$ a
4. 空循环 100000 次 202s
3 r! b( m, X% Y9 P% i+ j# ?% Z) S
1 i, _/ ]8 S, l; v1 b, Z不做内循环 200s) s8 _- m" w9 i
0 l- i- C: ^6 P+ ]! @6 e) s
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
' ~) V' L/ y: D* O/ p( e另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
- M# x( ?$ J3 G! G, [# K5 @+ J! S
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
3 p) x& d& C- _ O# j6 V- G0 m8 h% f- O' K& C
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
7 R" ` d0 _4 Z+ g, |) `5 {& s, F" N& n( _# ^; e' [0 I* d9 P
std::vector < float > vec1(N);
& C0 p' r7 `- k* V) `2 J1 B' e std::vector < float > vec2(N);
* X* Q+ [1 b q9 \1 K. s float* b1 = new float[N];
7 r4 f, ^3 c3 Y( g4 r! Z- q float* b2 = new float[N];
' Z0 ?* ?4 B" Q7 R5 \8 b" _8 F) \1 o; Y0 \& R
for (int j = 0; j < 6000; j++)) D- O9 H4 @5 N' V# k) h4 A
{
' W0 g+ z5 S! N G std::generate(vec1.begin(), vec1.end(), []() {
0 L7 t8 x/ I/ h return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
5 `( W' u" x* P });
" w" n1 i: T# c( i6 ?5 T
% p* a8 F8 M4 N9 I; W3 ? std::generate(vec2.begin(), vec2.end(), []() {2 {8 r/ v: o$ V( d
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;7 E3 M) u* C8 e- o
});
: b9 @5 b' G) `, T/ Y+ i+ o! i0 O1 D
Z) f7 S% }: f9 [& \/ P for (size_t jj = 0; jj < vec1.size(); jj++)9 l W3 z$ h8 _5 T
{
* {* u: H1 Y7 Z9 y& ^7 L `. k9 X b1[jj] = vec1[jj];
: c1 V) q6 J8 c3 y; k } l; i# l% X* C" C
+ s6 y r% N# P1 Q: ` for (size_t jj = 0; jj < vec2.size(); jj++)
3 P Z! q( V; Y! v0 y/ V+ E# b {5 D; {' X& d$ }6 b
b2[jj] = vec2[jj];8 X, N' M( x, M
}
& ^; \& ]; V6 a. ~1 Z" B
/ _0 g! j; p( D( X' _ //Method - 1 N=100000 247s
5 T7 z. u* _+ } R i1 { //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
$ J0 }3 O" z$ i) A1 R+ B $ |; Y7 K, [/ o
//Method - 2 N=100000 237s
& K9 I" i5 H }; y' i* S /*
. g& w. `, G7 z5 [ p4 E/ f9 P for (int jj = 0; jj < N ; jj++)
- C/ G( i5 f8 f- g {! B. i0 H! m y
fresult += vec1[jj] * vec2[jj];
6 ^3 ^0 M8 |, v9 P/ b0 x: ] }
$ _. e' v$ @ n' J */* T7 T3 \6 S H
* y; S F/ u% k X
//Method - 3 N=100000 204s) Z9 w1 z P- w; a* x
/*
/ ]( R1 Y9 ]) D$ J for (int jj = 0; jj < N; jj++)
1 E4 K/ n) R( c1 o* e {
4 k9 w. J7 `% F+ |/ Y3 t fresult += b1[jj] * b2[jj];
6 Y! [ t" V W. ] }$ @, ?7 w I% e! U
*/
5 m& h z/ D# Z0 l
7 @4 D; N4 ~( G1 l9 {' a //Method - 4 202s
# n- C4 i: d% n& D0 x0 k; F /*
4 u1 s- ~- d" f8 H- I5 ]5 C for (int jj = 0; jj < N; jj++), Y: W- n, L! }0 z
{: l; H* x; f/ ` n/ L% T" j
7 p0 v/ }/ g6 M, R4 _
}
5 r4 R: Z5 e4 q: n */
* m5 U2 y) e& v' ?8 S- E3 O //comment out all methods, N=100000 202s d% ?+ }6 n2 [/ W3 b
}
) n2 n; L8 B! @" ]1 ]# e# c5 x5 a5 Y8 O3 R7 A% l
delete []b1;
# e/ X* h# Z- \9 k; y delete []b2; . N$ x5 P) f# f* X) X7 s1 G
|
|