TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 k$ r+ }! z8 A5 `' X0 w' k
* k: x* s4 K8 k+ ?, ]3 Y- U& X理了理思路,重新做了一个测试。
7 r( o4 s' Y' e" p9 O% y做了两个 vector 和 两个 float *, 都长 100000
2 r" u' q" P: e5 a2 d外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.# w; E& d- R8 U/ ]
8 |* k1 H5 ~4 x内循环试了4种方法,+ L( o5 G! U1 W! t4 L4 R% }
1. 直接调用 vector inner_product 247s 6 s Z c0 g4 i4 ~; T, c
2. vector 循环点乘累加 237s
: u% d5 T% M8 W6 G8 | U( r* B% d3. float * 循环点乘累加 204s
]( K. H I, F' w! M9 W/ k+ R+ i4. 空循环 100000 次 202s
5 U' E5 X; Z6 K3 T* v% r+ w% A! J1 F
不做内循环 200s
/ H9 }: s- Q; u- E4 |) j0 H1 |0 H5 v- v9 O9 q
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
8 I$ B, n6 ~9 N* J另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
2 v! @" n4 S0 a& u* m3 A8 [& b8 }+ a( L0 X i
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)7 T* s1 _4 D6 B# o6 m. Z
5 u9 D i' X+ J' \1 i0 C2 e6 X(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)3 W2 A& b, m) D2 n* y. k8 ?# W
: ]+ n, m& f# b; Q std::vector < float > vec1(N);9 o n1 u P q# r: s, a: u' _) l
std::vector < float > vec2(N);2 j2 Y5 r- I* u2 z0 ^3 m7 Q
float* b1 = new float[N];
0 @$ `+ o2 \ K$ n+ v0 i float* b2 = new float[N];6 K+ n, v7 Z: c) y3 j" ?
: e" T( R: e D7 p# J9 [9 S/ O
for (int j = 0; j < 6000; j++)4 O3 M) n2 l5 b
{
6 z: O0 Z( N x' {2 e+ U std::generate(vec1.begin(), vec1.end(), []() {
7 m9 {+ k" i; ~5 }# z return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));; a4 w9 h0 ]$ r0 Q. r- K
});
3 u; n9 D) t. I) `/ Z# t
* |. }1 y4 t) D1 i+ @ std::generate(vec2.begin(), vec2.end(), []() {5 u* p1 Q3 C' i4 C
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;; V' E6 F3 W: [
});
4 p& W/ r6 N( ^, O5 F+ i
1 @/ g1 b c% I; c# ~4 j: M' p L for (size_t jj = 0; jj < vec1.size(); jj++)' L" t: Z" {* E' o, ?
{
( t. w l/ I0 u4 c$ `$ F b1[jj] = vec1[jj];
* w6 q l; r3 G" f4 ~+ t# l0 w- E" v }8 d3 [0 C3 S1 V! l
' ~8 M @, c, M! ]- d$ M
for (size_t jj = 0; jj < vec2.size(); jj++)4 e2 d3 i, b+ z M" |
{& j2 P- G* r C6 @+ @8 n0 Z: D
b2[jj] = vec2[jj];
1 I2 `6 }8 X+ J3 q1 K }# h9 V6 U: H- q8 h# A
$ a Q& z E( ^9 H& R' z1 O+ S
//Method - 1 N=100000 247s
4 R/ _1 w9 n" ^- s1 b2 B //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
8 e0 ]( @0 D% H& Z0 s 3 ?0 l. {# y; V7 V! H9 ?' A
//Method - 2 N=100000 237s7 o" x' b! |' J
/*
9 G# _' d, M0 v for (int jj = 0; jj < N ; jj++)
D$ {9 v4 Q7 m {
( t& w, }0 }" G: v- E u fresult += vec1[jj] * vec2[jj];9 \: d4 K) A' W0 F8 [; N
}7 d) \& B2 P+ j+ b
*/$ G' t6 y' g: F! ?
- s+ t& R v q, a e. w) T( p
//Method - 3 N=100000 204s
: x t: F& L; X5 { /*8 _5 u* H* m. x& A) B
for (int jj = 0; jj < N; jj++)7 k( M) j5 L' |# p" S; A
{
1 _% @* F; F- n* x5 E' |8 S+ M fresult += b1[jj] * b2[jj];
( o4 h. ]9 v O! M. y* @/ l }: ]- O4 v7 I& v( f3 t
*/
' I6 K# C$ e: y8 w
& a; V1 n5 J* T% e; ?. @ //Method - 4 202s+ g9 Q% X; x6 Z
/*
) q+ {- u/ d0 y6 U% l6 s* U4 {1 b for (int jj = 0; jj < N; jj++)3 q1 |+ e7 p: i7 e0 v
{. G2 S7 K, G4 p# d
3 N7 _5 j* G" [; D- h* i
}
$ g% S7 J r' z0 i8 t( W9 S */$ Q* m1 W5 r/ B; }0 z: b3 l
//comment out all methods, N=100000 202s
6 I y# E" @( P0 d }* \: A* A+ u9 d+ E6 E
1 u2 A. R {7 x* A+ Y# e x
delete []b1;
) a. b' I0 S. ?" C2 k5 z% i/ l2 @ delete []b2; ( V" i6 n5 ~0 G4 t0 J9 ]5 ~6 [% B
|
|