TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 + c* n' }" r" w# p A
1 y$ A- C; ^" i1 T理了理思路,重新做了一个测试。) _. {8 x! O. w& {& M2 Q: e3 E* U
做了两个 vector 和 两个 float *, 都长 1000006 W5 G- W4 W4 _6 V6 T9 P
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.3 D. H5 x. E6 b# f" V, r
1 y A" u! p- X- ^4 K) Y* q
内循环试了4种方法,
# o2 V$ v0 \" y6 E' R9 S6 p1. 直接调用 vector inner_product 247s
# i# S$ Z; {! C! B% W" S2. vector 循环点乘累加 237s& g' j# V7 A, ~) Q) X! Y0 Y( k
3. float * 循环点乘累加 204s5 f3 H; T8 p1 H/ y, n" r6 w+ J
4. 空循环 100000 次 202s4 W: W, w6 m+ S! O8 J6 P+ B1 u
( S x" o, m, M$ T0 f2 S4 u' k不做内循环 200s9 b/ _0 j" E/ K& `/ G, a
. h! R" q5 Q, i0 G, o你昨天说的对,内循环本身占比是很小的,大头在其他处理。' O9 {$ O3 o: u1 O
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
6 `) w) {- I- A# z0 b( n: m) j
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)$ P/ i* {# X/ i: ^ }% Y/ Q
( I4 p8 I- u6 U1 M0 a% E
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)7 C$ Y% |, N7 B \4 T+ _
# f& w, V+ R5 g/ Z/ `2 f std::vector < float > vec1(N);
C u) U' Z' T9 S, v+ E2 l std::vector < float > vec2(N);% M* O( P3 ~8 }) _$ C! g- j0 E
float* b1 = new float[N];
0 M: m$ j2 Z: \$ b float* b2 = new float[N]; _4 y8 U, \6 n9 \4 m
7 F5 A8 L! D4 V5 u; t) ^- n for (int j = 0; j < 6000; j++)0 Z) A+ e1 `! K+ h+ F
{
2 s* Z% h" @1 }/ e6 D$ L std::generate(vec1.begin(), vec1.end(), []() {' Y4 T- x7 W: N" r; _. g# t
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;+ { O$ L+ y( o6 Q& i
});& F9 w+ J( f0 d6 b7 F3 s
8 K: h Q# O% l }3 n8 p4 ~
std::generate(vec2.begin(), vec2.end(), []() {$ \2 o3 P& }" \* l
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
! |" e% T4 q/ \7 Z+ o8 g });3 V5 ?9 W) ]# ~* u; f
+ v" o" A1 |+ e( d: q
for (size_t jj = 0; jj < vec1.size(); jj++)0 b$ X) t0 h1 i$ [1 D% A
{
* }% _8 t% L2 ? b1[jj] = vec1[jj]; H% t& Q: U% @" t4 i, _
}+ j3 U3 z5 O( ~ c
* G( C: v" G5 z( K( f3 ^ for (size_t jj = 0; jj < vec2.size(); jj++)
$ [6 q8 Q( R9 j1 O8 w {" G+ q$ y. ?+ [" G! ?4 O. t0 Y: D
b2[jj] = vec2[jj];) N0 B. W; q8 [+ U
}& b; E4 C4 F9 M4 a. o: G$ Q% Q
' Z( \; d; b5 ~: j# m //Method - 1 N=100000 247s
3 S6 g9 z( Z$ D" o //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
$ X# |/ K6 U: c* s- u H * X/ k9 @! [0 S5 E( x% ]
//Method - 2 N=100000 237s
2 |$ W8 N. t- R4 P6 }* T /*
. F: g* d8 m6 U) A$ T6 [$ a for (int jj = 0; jj < N ; jj++), D# T- k, x6 B% A$ N' k
{2 K# s2 b/ c7 Q/ C8 y" Q
fresult += vec1[jj] * vec2[jj];
) [( x% A, u5 X) d. d }4 J# Q- ~3 t! ?# F! g' P$ l
*/
5 B& k: u" G5 M; E, w( N8 U! }) W8 n / A9 S, U, z2 X3 e7 Y$ r
//Method - 3 N=100000 204s h) H1 p. W# J6 s5 M% g
/*/ B5 [4 w% `6 u6 @
for (int jj = 0; jj < N; jj++)! K2 S/ w' O& t/ I% z9 P
{1 |! ?1 [( p; p! ]7 u% f
fresult += b1[jj] * b2[jj];7 k! T/ {0 B2 e; M
}
5 C- t# K; w8 Y. U */7 C/ R7 z" _. E% P
R! N/ D$ `2 Q+ i8 \+ B6 E
//Method - 4 202s
' y1 v2 Q/ w3 ^4 u0 k1 h8 ?/ r /*2 F+ n: ?5 e% @1 k" U
for (int jj = 0; jj < N; jj++)
( F4 @/ f/ w* v0 X) N {, e. J0 b Y$ R: M) }$ z% M
& f- N1 m. j* [. U
}
. ~8 H G% ^0 {3 `6 l; t) T; s, D */
6 d0 I" |- r5 ^ //comment out all methods, N=100000 202s
$ R$ o' B& a" c' j3 N N' ? R2 G }' [, r% O- t. |5 z% \4 I, Q
7 d0 m' I4 r. }& S2 Y( A
delete []b1;" T. c1 i# N+ T, ?4 }
delete []b2;
4 l% t1 \1 a+ _$ Y1 b" i# m6 H, C |
|