TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 7 m& K# O8 M' x% c6 C/ {" E( B9 A
# \; R2 u4 F/ f/ U9 L
理了理思路,重新做了一个测试。
3 f A" a' n& f; w4 x做了两个 vector 和 两个 float *, 都长 100000# V8 [- y; b2 [3 ~' E, @( }
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.: ~8 @2 B5 v1 N, f( c- ?/ L
3 V9 ` p& S$ } l
内循环试了4种方法,% t, z ]# O1 f7 S# N" ]
1. 直接调用 vector inner_product 247s . R+ G! F1 J5 w
2. vector 循环点乘累加 237s! d1 _$ ?& ^) U$ ^9 {/ x
3. float * 循环点乘累加 204s# I# o$ o( X v2 {) d, R! S- J
4. 空循环 100000 次 202s
9 `9 F2 |7 S! S7 A! b6 {9 `9 ^
1 d B2 i8 y R' k. v7 M不做内循环 200s9 C; B5 i+ x. J p. `$ k
& V( _# y5 r( D* C( X
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
8 g/ A8 d' i3 ~2 y- ?0 G. J4 r+ B3 r另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。/ A- @% g1 w3 b, n7 Q% g' t4 n, T
& a1 d) h7 i4 T2 K至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)3 A, _+ a1 L1 `* t: p
@1 m8 _. M' t" w$ G2 Z: L* z: M7 G
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
1 y8 l i# P3 {: u6 I( {: a
: h, q7 K9 j, R4 k6 v& L+ t std::vector < float > vec1(N);
0 Y8 G6 z: W$ T std::vector < float > vec2(N);2 c) Q- A: ~0 ^4 s
float* b1 = new float[N];
2 b9 e/ k ^) T float* b2 = new float[N];
6 j( C$ k8 J6 L/ B6 y
v" ^. ^( F5 q9 S3 } V for (int j = 0; j < 6000; j++)3 |$ P: ]! F; i
{& N' t1 F" R4 u
std::generate(vec1.begin(), vec1.end(), []() {, }4 \* h W# }( X( p
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
$ ~9 M, Q+ I1 ], [9 A });& K' K. b6 c( e% t
w% i8 b2 {" x* o
std::generate(vec2.begin(), vec2.end(), []() {1 _& v2 u# g2 Z5 s$ L6 t$ h0 e7 `% P
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;2 { d4 T2 y$ x, n+ f3 N: L+ _: C
});5 G8 l$ {0 d7 Q8 b
5 L& `% i/ g( M! S9 `
for (size_t jj = 0; jj < vec1.size(); jj++)
: I4 W+ r8 v( B1 m5 K: A& J {
& j' I. {9 q$ \' i) n( ]* e b1[jj] = vec1[jj];
) L" J; {( R6 F- L }* P% }& t- K' B( o2 L2 [
0 j3 j( B: U7 b9 ^ F. {2 B8 S7 R
for (size_t jj = 0; jj < vec2.size(); jj++)
' D' Z+ F( \$ f' H8 v* m {+ ], d# i0 V+ j" W2 J+ {1 H. R" Z
b2[jj] = vec2[jj];& v5 {) T9 M( g5 a/ M. I& m
}
0 W+ P1 ? U/ T& i3 z+ e/ n- u% K7 w4 r
//Method - 1 N=100000 247s
6 k4 W9 C3 Z+ L3 L( G //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);: V) D' Q9 ~) I& m2 N. U, s
- ?( `9 S7 Q4 i) V _" a6 d6 P/ ~4 _
//Method - 2 N=100000 237s
& m$ H* [2 I) a9 Z- N9 l /*
1 u$ I q/ }; O. i' `3 P( h for (int jj = 0; jj < N ; jj++)- y9 |7 D z" j Z( J" C
{
( r% B' t: N3 k" _7 H0 i: e fresult += vec1[jj] * vec2[jj];
F& I) ]$ U; A5 }/ w$ K4 @ }
: T2 _( [2 a' {# d4 ~1 {' L */
( u6 `% e+ H8 m ) P- p2 a- S* c1 x: M
//Method - 3 N=100000 204s/ S4 e6 u; a1 v& l* i
/*
+ ~9 S+ X1 b+ M# A0 r% g1 c for (int jj = 0; jj < N; jj++)
2 r _- r9 Y _' c {
+ I3 R# F( E, t$ w fresult += b1[jj] * b2[jj];( j5 a8 J) v' V0 ^& x; x$ G
}
& ]3 N' ?7 j0 C) H */. y+ |) [8 d& N3 \1 x
1 [% I' d6 s3 D
//Method - 4 202s
7 i; s9 y0 {, G3 n3 z /*
S, w! l% v, L- X- x: y for (int jj = 0; jj < N; jj++)
" m( }0 c) p' t% \* x9 g2 a5 q( E {
2 L6 y! i( T" M$ t6 _- I ( _: }& v, E( {& z* J/ I
}
: D$ Q. }. M: {9 |2 f# [) D */6 c {1 ?2 \" n6 ^8 w
//comment out all methods, N=100000 202s
& \9 H& C+ l3 x) k- g! k% o, v. F }
; b0 j9 W$ [; i$ G( \
$ c) ?, J& R7 K! U! z( ? delete []b1;
& Q/ x3 G6 d* ^$ n% w5 D& E) [ delete []b2;
. i( W! i0 ^1 i0 T0 M {6 a |
|