TA的每日心情 | 擦汗 2024-9-2 21:30 |
---|
签到天数: 1181 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 8 m$ }4 {, \- r, g7 ^& b: L
7 y9 X+ C1 N# S7 l, }8 Y, @: h理了理思路,重新做了一个测试。
0 \2 M r" d8 R- Y做了两个 vector 和 两个 float *, 都长 1000001 S2 f y) J2 Y. L; x# p) L
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
9 x8 r& i% F7 Q) K
$ r; L7 p% s7 a内循环试了4种方法,
6 l1 y' N2 o; O+ B" N1. 直接调用 vector inner_product 247s 4 m. @0 ?8 m6 Z+ i; h' e& [% o
2. vector 循环点乘累加 237s3 P2 Y8 ~+ K+ m! x. O9 g0 l6 ]* }3 `# I
3. float * 循环点乘累加 204s
1 R7 c6 ?1 W* r, h" K! @8 N4. 空循环 100000 次 202s1 Q( G7 o( D/ h* n0 J
# @+ L5 _5 W- W) x; V- ^
不做内循环 200s: i/ e" N+ J, V2 y1 ^
# K4 j+ H) b+ B6 b
你昨天说的对,内循环本身占比是很小的,大头在其他处理。6 b x* x2 ^8 q! a% \; w/ ^6 W9 }
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
. Q9 C7 y8 F9 x
& }) i- Y! r# Q5 ?5 F至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
0 E( m# a/ Y$ T$ h6 B
6 |. S$ H: x* W) }. z/ P- s(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)/ s4 T8 ^6 p* l% f7 W8 A' v
/ v$ o0 P3 \+ n+ Q! u% L
std::vector < float > vec1(N);2 b8 c- I3 f/ W& m. Y
std::vector < float > vec2(N);0 K5 W! v6 |( J3 u+ {
float* b1 = new float[N];! w2 \+ |/ z$ _* x' s) z. u% q
float* b2 = new float[N];
" X- p# ]8 d1 h8 n6 `3 P% c; s. s& K. M+ Y! c1 Y
for (int j = 0; j < 6000; j++) K" B* ?0 I9 B( G D# K0 r& o
{
/ y* T; S7 T+ \7 e( o) [ std::generate(vec1.begin(), vec1.end(), []() {
( a7 A3 l- i9 @9 x1 x$ ^ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
/ J6 R" T" @) A& Z# N( E+ { });
# M9 ^1 {7 u/ S1 p
% }- ^, J. r6 [7 O. j3 G std::generate(vec2.begin(), vec2.end(), []() {
, E; P2 Y7 |5 P! f3 l( F8 G return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
7 u6 v% b- z. R });
3 S. ^; u S. A. @" L8 p9 c3 i
for (size_t jj = 0; jj < vec1.size(); jj++)
" |; l7 Z: y! R1 K' p! p {
1 r' d5 T- p1 h) S) P7 q1 i; i b1[jj] = vec1[jj];. ]! v- M: ^- ^1 s& a
}7 x# d/ w' x9 |) }& y
. O. R0 F1 f8 j3 G3 p* Q
for (size_t jj = 0; jj < vec2.size(); jj++)
6 u5 F5 [ k _6 } {4 T8 T# e W3 N$ U# K( Q
b2[jj] = vec2[jj];& b( O) K0 b- S* d' f1 ^5 ]- g
}
2 Q, n5 u. N. Y* v* D4 _& ]9 I' ]1 M' _
//Method - 1 N=100000 247s
# s6 r, H' A4 e; [4 X6 O //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
" {; v; z8 K" A ! D8 \! H" T8 d/ _' {; r7 a) M( z$ Y4 o! Q
//Method - 2 N=100000 237s
3 l: N8 a J/ T: E8 ~: B /*& B; o7 G8 w% z+ o/ L6 y; v, P7 {6 \3 k
for (int jj = 0; jj < N ; jj++)6 n5 H1 _, b) k+ a" X1 I8 p
{
* H" [% ^' n& c# h' g fresult += vec1[jj] * vec2[jj];$ ^7 U; ?# n8 D7 P
}
! p# I0 m6 L6 M N0 J */
3 O; Q2 b1 p+ S2 }5 y * n9 ~( y5 [# f, F' T/ ~! K2 p/ M
//Method - 3 N=100000 204s9 i, I! L. \7 {+ X+ r( G
/*( _+ ^4 L' ^/ B* |
for (int jj = 0; jj < N; jj++)
& J. S7 x0 i* `6 y, s: y {
% p- l5 c1 u! M: I& k fresult += b1[jj] * b2[jj];4 y! x" Q+ _, Q, e. I* Q
}1 q" B* B6 a' v, ]
*/
. V6 z6 i- f% C, l' ]0 c& S& n" f) K
//Method - 4 202s
4 Q; {5 l, c- F4 V* y /*1 b+ r0 I+ i# t$ R
for (int jj = 0; jj < N; jj++): I% n2 d X# p+ z0 J
{! p2 G5 f& b9 P& q1 K. u
& {3 [# s$ A2 z R; J8 j9 ?, O
}
% r: E$ Q \. P5 r, |5 {6 Q */
$ R8 j* w1 A; T" a //comment out all methods, N=100000 202s / _5 w4 A6 C: H9 J. u" d
}
( P. S+ S' P' L, |
$ W- p! c/ Z3 v# X5 t5 q" S* s' x delete []b1;/ Q, ~9 [, B o7 X
delete []b2;
+ D7 k9 p, \, v4 x _: Q; D |
|