TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 4 _4 _* c1 O& c
$ i1 z0 w4 @, |理了理思路,重新做了一个测试。" @& q: R, ?" X
做了两个 vector 和 两个 float *, 都长 100000
3 g$ r4 G3 z8 x8 D+ E7 A外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
( x1 z+ \/ D8 Q8 L- t9 Y0 s3 p
: A. l: v# K, T! @内循环试了4种方法,. h& L& D, d- d7 X% c& e) g6 ?
1. 直接调用 vector inner_product 247s
* h R# t: N& J2. vector 循环点乘累加 237s
& ]! ?, C% N/ H6 y3. float * 循环点乘累加 204s, O" O! \ N2 Q% x% q
4. 空循环 100000 次 202s3 t4 J6 O1 ]4 v1 m- B5 l5 F! @
3 {/ u) n% s; w6 I; Z6 S不做内循环 200s
0 F T9 ~5 _1 h7 g; S
6 T4 g% s/ ~+ x3 ?" |你昨天说的对,内循环本身占比是很小的,大头在其他处理。
8 [+ s0 X9 }! C0 w另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
4 [0 x1 y5 w7 o* a, N3 y
- ? H4 z" ^ n9 O/ S+ t5 b4 C3 |至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)6 g/ w( W+ N# A6 c( A0 k& W
) f$ Y8 s. U4 u2 L+ C7 }
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL): k4 i/ e: A$ z: p
7 _$ E9 d! i. b6 W
std::vector < float > vec1(N);
8 H& f* {6 y( g9 H" Z" f' l std::vector < float > vec2(N);
& U0 @' S& h, q- E3 `& l float* b1 = new float[N];: B; y0 D4 ^- e+ F
float* b2 = new float[N]; u+ f8 n V9 P* T8 n% S$ x
# `) c- M; {* M) Q8 x) {. Z for (int j = 0; j < 6000; j++)
6 R2 W' I- m5 |/ x {
2 l [, _, i5 g) a: J- W std::generate(vec1.begin(), vec1.end(), []() {
' [# i* R1 B1 v" g/ V1 c return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
+ w" g8 j# q. Y2 b$ F2 p$ D });, d, L$ X) y* n$ q1 J/ _
% O5 x& U7 S- I' D: L
std::generate(vec2.begin(), vec2.end(), []() {
, Z) [% ?6 _% o b0 \ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;% ?) T2 {5 U/ f
});
: y, H3 l9 \& g2 p. ^' T/ `9 _# z+ I B+ V) [! j/ l0 ]
for (size_t jj = 0; jj < vec1.size(); jj++)
) z! }& @8 o9 n- e8 M# q4 w {; A/ t7 \$ O( ~* `
b1[jj] = vec1[jj];
2 D! V8 X3 p, a }
9 p1 ?; Z; ^* F) |# U" I7 m4 W$ G9 K! i) l: W- q9 z0 _9 ]' x
for (size_t jj = 0; jj < vec2.size(); jj++)
; v$ d/ d' [6 c& {/ L/ X {6 w. i( m8 m' _9 W+ S m
b2[jj] = vec2[jj];
6 c7 e+ |3 F4 ]9 \. F4 i$ k }' x3 I$ I5 G( p) E/ B" y
! R4 @' a8 G( {1 O' G7 T8 ~9 Z
//Method - 1 N=100000 247s 5 J9 ~$ ~0 m. V: ~: V$ \+ K
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);3 u8 ^5 q: r* }4 V9 G4 G
- j: `3 K- M/ x7 z
//Method - 2 N=100000 237s
7 u) j: C) k( S5 B' z; p! s. w /*
. f( w0 k! F4 U* J8 n7 M" Q for (int jj = 0; jj < N ; jj++)
' C+ @2 j$ N, X5 B! Q2 A# V3 ? {+ r. G* f9 w' o5 n! o/ A7 Q! [
fresult += vec1[jj] * vec2[jj];
v: C) x% e9 K2 u) a7 c7 b }; v( b; V) ~" |+ _' R X
*/
& A; A+ V$ F% g* E9 f5 i( s 1 N1 @, ]7 \: } v
//Method - 3 N=100000 204s6 B8 T! ~7 v) ~* c# x9 S
/*2 @# Z' m! r5 z& c
for (int jj = 0; jj < N; jj++)
+ x" R7 t" S4 I* ]$ _$ [0 O {- h" A2 ^. M. l% C
fresult += b1[jj] * b2[jj];
) T. i/ Z/ W8 O" d- y& E! V }7 x: Q; P/ R; Q
*/: n6 H8 i9 u$ ^
1 Y: t! E. j; p. U. g //Method - 4 202s
! T% F5 p# U, D0 O+ A /*9 N. |! @7 X9 e$ m/ j
for (int jj = 0; jj < N; jj++)
- n5 x3 C* [" T9 h$ r# j {
0 q3 Z; W/ w! _% d* _ 1 M+ H! s& O& s5 L
}" F4 ^2 H2 z& O @
*/
2 x$ }* M8 Z, [ //comment out all methods, N=100000 202s 1 P, ?9 b7 D5 y& |0 m2 `6 ~
}
% Z) c2 n& B& M- O4 z7 B+ h& d' H
0 w9 R2 z/ t1 p+ c delete []b1;
6 o4 w( k6 P. o) `" L) R, F" r delete []b2; 7 L$ Y0 |+ P& e H, D4 p Q
|
|