TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 6 C9 q* F4 x/ R, g; E
2 B1 Q7 k- ^% c7 \! o6 p3 ?6 |8 o
理了理思路,重新做了一个测试。
! l# b: ^1 l' L2 ^& r$ L1 ~- I9 r做了两个 vector 和 两个 float *, 都长 100000
5 u6 P& V2 I' F/ C7 {; Z外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
' J- Q) q: b/ J( b6 x. ` W
6 o. j& {/ X* ?, A9 A6 }& f5 U内循环试了4种方法,
% \% J( s( R7 M Z6 F% J, m8 A& w, d1. 直接调用 vector inner_product 247s
3 E @2 V' p7 ]/ |2. vector 循环点乘累加 237s
8 [/ O, A! l8 ?6 \) v3. float * 循环点乘累加 204s
$ O4 \7 v. t* r' d6 n) s* o4. 空循环 100000 次 202s% u/ O) z( }' g9 |% F1 C# V! @/ C
5 q$ @0 k# B# {* l$ Z5 P
不做内循环 200s, z% j4 \6 J9 F/ }4 T3 ^! n0 Y
5 W% H" A9 [6 A8 u4 {
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
1 d, y% C& X$ P2 u( j6 h另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
# D4 @* s( k2 W/ a' [" R8 L# o) Z' N. v/ i* L& x' C
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)8 m' R2 t t8 y
P. ]) G6 O G, _2 ?(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
( L; [' q# H5 e
& r' f( M: t) |, L9 E std::vector < float > vec1(N);
0 j& Z1 t2 t+ b& f std::vector < float > vec2(N);
" Z k. M4 y9 @! p5 f6 h" H9 `/ Q float* b1 = new float[N];! a9 J2 g0 Q( c. R, V
float* b2 = new float[N];
4 l/ k4 b4 O: g6 j' A4 L# g: O% e2 g# M/ J6 D# O
for (int j = 0; j < 6000; j++). @9 j2 s( u3 C5 c4 {
{: F+ e$ p9 |6 `
std::generate(vec1.begin(), vec1.end(), []() {
( x) m K4 E( P0 z return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;2 d9 L; e& p2 g0 F5 t% e
});
8 X% O, r4 V/ t# q# s
, M" ?) S( n# U4 p. p std::generate(vec2.begin(), vec2.end(), []() {
9 Y! R1 g6 A A ^ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
& J+ ^8 y- _6 _% a, S1 ?. D });
9 F6 m- h& b' ]1 s( b
0 j# s4 t% Q+ W6 B! ]0 x; W: g for (size_t jj = 0; jj < vec1.size(); jj++)# H h* v6 M, k5 x: ]) e7 A
{
' V0 G, e: w* C7 j4 x5 J2 A! E b1[jj] = vec1[jj];
9 o3 k2 t! ?- @1 P' H! o }
9 v* V- X: |0 U" Q1 z" ?9 c2 G* N ?, D H0 {5 c* _; g" b
for (size_t jj = 0; jj < vec2.size(); jj++)
. e' a3 N' _% C, y7 M {
] U9 a! N1 }0 v4 w' t) }; u1 X6 e b2[jj] = vec2[jj];1 l* G j$ p' d u; r
}+ E y1 F0 q( N, ?
$ N: m* W4 s' s# n2 Q* ]
//Method - 1 N=100000 247s , `$ z" z# g. [' v9 M( g, |
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);/ {, f9 t7 ~ a* ^9 B% a3 y/ U
/ ~2 i7 U. A+ H; R //Method - 2 N=100000 237s' W% Z" F' a7 C: r3 x# ^5 S3 ?( A
/*4 |0 K2 e# ?3 G! m
for (int jj = 0; jj < N ; jj++) `) f. l% f. _. d* Z% m/ `
{' t. }( q3 j, z) U6 Z
fresult += vec1[jj] * vec2[jj];! w2 f2 ~( s& |- x. d7 L. \6 j" _
}
: i, w/ M2 t9 W, Y( g- r' f */- Q' G0 X; @/ }) Y, z
3 K2 U/ q0 L; y& A) u1 B$ C //Method - 3 N=100000 204s+ I# i1 x" [4 T& d6 b+ x; W
/*
- x" R; ]. h# X4 l" S$ z3 k% ]& Y3 C for (int jj = 0; jj < N; jj++)8 ~( N8 N) X4 l! h4 ?8 W' k+ i2 r) L
{
5 H* F. `1 f+ o+ u% q fresult += b1[jj] * b2[jj];
0 t. C& Q( E+ Y% c1 L# q }
- o5 `8 \7 Y/ |4 _- b2 y" k* G */
% `& b2 s: h' q' @1 m: K
( h$ N# t: `0 ^! F% j: P7 W //Method - 4 202s
8 _5 h# v2 e$ s /*
9 R* k2 D% j/ c9 o M, S( |: } for (int jj = 0; jj < N; jj++)
9 {! z& v- k+ w) I, V {
' S; H6 O8 j& _; v
2 x4 M2 ?) J4 o& ]5 W0 B! u }
1 [! u% B/ u P% e2 b1 ?8 H) o2 g1 i& n */+ @' @$ y, ?' e. @ f$ i
//comment out all methods, N=100000 202s $ f# u+ z' f9 \) `. Q" d3 j6 ]
}( u( b/ Q! ~! |& x* R; \7 N
. y f/ C' {' v6 f2 f5 J& ?8 M/ g' o
delete []b1;# r. C7 c1 V4 O& z- T& W6 w
delete []b2;
2 S& X7 |9 s. D |
|