TA的每日心情 | 擦汗 2024-9-2 21:30 |
---|
签到天数: 1181 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
. f6 n* K$ `4 {9 I3 R. ?+ c* G
! Y8 W, @9 ^' E: E/ e8 J理了理思路,重新做了一个测试。4 L% I" e5 L& ?2 u! q2 x. m& g$ i- O7 A
做了两个 vector 和 两个 float *, 都长 100000+ q, B2 }% R3 ]; m9 w
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.* Z' A% J) W! ^0 W
4 i0 o% [' Q9 C- V( J; y2 w内循环试了4种方法,, Y3 e2 z% v# E# b5 t( i5 R W
1. 直接调用 vector inner_product 247s 0 g i( {7 {. u# a4 Y
2. vector 循环点乘累加 237s
5 d: E8 t. {7 k# m; b3. float * 循环点乘累加 204s y/ g1 P; a4 Y0 [- V0 D& K/ W8 e
4. 空循环 100000 次 202s
; D# ]' y. l" S$ r7 W+ s
/ R- V/ _( y, H: V+ g+ M( O不做内循环 200s- ~* g, q x5 j0 _2 Y- H
# ], c4 D$ Z) F# R; F8 |
你昨天说的对,内循环本身占比是很小的,大头在其他处理。" U6 ~1 v9 R5 N( b
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。( w$ @$ J( r, Q0 H
/ D$ }6 W4 F1 ?0 T; {) t4 J至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)! D6 X$ D/ N/ B0 B
' R! {! M. B2 n- a: D4 u(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
3 S4 o1 T/ P W# d* E1 l" @- `/ E) p. N4 u1 t8 @
std::vector < float > vec1(N);: a. j! L Z r+ O* H
std::vector < float > vec2(N);
! a& T4 s1 L" G9 q9 z$ b" n float* b1 = new float[N];6 s. y0 Z. D' r" b+ e9 |8 O
float* b2 = new float[N];$ M% S& n, ~$ C4 B% J6 v
9 d; `( Y$ D. C for (int j = 0; j < 6000; j++)# \# g" g# ^" P$ V4 Q! q1 s
{
2 V2 w& M1 u( ]: T8 X& d std::generate(vec1.begin(), vec1.end(), []() {
$ L1 B" V4 R& P9 X" f+ K; Q4 ` return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
7 v& g$ ]# d6 D. X/ M+ n( K% O0 o* I) p });
9 i$ P/ v+ v* n( t, ~' q+ T8 T+ Q% |# H& O; n& Q$ i
std::generate(vec2.begin(), vec2.end(), []() {4 G1 v( l; V8 q: A
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;6 v- s* [* Z; b4 v
});- U, H& M$ T( r d/ }% A/ |
% B j v/ @8 u8 [
for (size_t jj = 0; jj < vec1.size(); jj++)
# h, F/ V$ I6 H& u" b {4 f P0 ]" @9 j% ~$ T3 M" A. X
b1[jj] = vec1[jj];+ @3 l+ x. d% }7 e( }; x" r
}
" l0 w7 x& E& O5 z& ?7 n0 s- c* k0 M
for (size_t jj = 0; jj < vec2.size(); jj++)) V9 i2 n( q8 @3 f* M/ Q
{
$ b3 F, |9 H% t. a b2[jj] = vec2[jj];
) D7 q$ i" R% |: h1 j }
% j0 W" Z/ a, a* J- C2 I0 Q4 f9 G0 ^
//Method - 1 N=100000 247s
$ ?7 ?6 M @+ m" M! z& z+ q //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
- D& P6 f L |- Y " _% O: U! ]1 n" }, F, i
//Method - 2 N=100000 237s. l! O# z& x6 [! E1 j/ l& F) x
/*: Q5 x) c! u5 c6 r
for (int jj = 0; jj < N ; jj++)
4 `. _) ]/ m& F) `+ R {$ Q3 M7 _. _7 O: q) ^) }; y
fresult += vec1[jj] * vec2[jj];
) B7 }: w3 n- v0 s$ O3 f9 w* I1 { }
# h0 l$ @1 r$ \. S0 [ */
0 Z T0 b1 j# g; x z2 C+ X# ~& K
/ B" Q, b0 w* R2 P# r$ h. y //Method - 3 N=100000 204s
- L2 N. v, D* O" y /*9 ?% U( o& G3 h" t# D$ I6 X* \4 F$ K
for (int jj = 0; jj < N; jj++)+ _! P: `3 ^; k9 ?/ t
{
2 l6 \; I) ?/ q2 s( ^ fresult += b1[jj] * b2[jj];7 K; K. S, d) E3 v0 t/ M
}6 p4 H/ n! }* u& t0 ^/ n2 @/ ]+ O
*/! I' K @% O* k& k" h2 W
9 d$ k8 M! A g, G( O N* \& Z
//Method - 4 202s' v2 P$ B7 W( C- j8 }$ x
/*
; O8 I% M" I! G7 X V8 s, T for (int jj = 0; jj < N; jj++)
) y. `* F! U; E/ T$ u8 E {0 U1 b m' y' r5 `0 K) Q
% s. C/ s- f: s' q
}
: `* B& Z- D$ {' m( M% E */
3 |' C- f. s1 q- v3 L2 \ //comment out all methods, N=100000 202s
1 F! X$ ^$ Y9 j; L" d7 C# l }& Q" a j( R& j* \" d9 u# n
4 t8 T% `. ` A. D1 b4 U3 [% b+ } delete []b1;3 `7 q0 o- H/ R! O4 e2 d
delete []b2;
& g: h8 Q+ A. q& z, Z4 p( t |
|