TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 : b: W7 o8 b+ L3 L
+ u+ c. E+ T: n理了理思路,重新做了一个测试。. { R; h8 f+ l) U
做了两个 vector 和 两个 float *, 都长 1000008 {$ d0 [0 ]: i/ u9 R$ U+ c8 _
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
' l' {3 G: x4 W( Y: b
* X" w3 K7 s, e5 G3 i; N' n$ o内循环试了4种方法,
* V1 v. Q* o/ l6 h1. 直接调用 vector inner_product 247s
3 ~6 U! ~, T0 G+ G% F2. vector 循环点乘累加 237s
( j9 N& B, Q. ^9 V5 C( t3. float * 循环点乘累加 204s4 r& R% A+ }" T1 g* n8 d. v
4. 空循环 100000 次 202s
0 t0 V+ d3 t( ?* y+ w9 q" f. |- R. M1 {1 O5 s1 ?$ S( W6 Q6 l+ p; O
不做内循环 200s
9 N5 X$ O& j. i5 `0 W8 y! r/ p: k" T# L+ k8 {2 @
你昨天说的对,内循环本身占比是很小的,大头在其他处理。: T6 U( b9 ?, f1 r8 c
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
% H4 M; w/ v& X# Y0 v
) x# `2 L) B( |! j' r至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
9 r; b8 X+ [ X* P, Y3 }2 a0 F) c8 r" q/ J( ?+ i- y1 c
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)6 i2 u3 O+ X7 d% L9 U5 Z" |) k
& w8 f; _; ~* E std::vector < float > vec1(N);
. K/ H# f6 {8 |( A std::vector < float > vec2(N);
6 K/ z+ D3 E( P+ _/ u& Y float* b1 = new float[N];
+ D6 g% {! L8 S2 B float* b2 = new float[N];
$ { C5 o8 B7 T' |1 @5 H' `
& }6 L6 F$ w x q for (int j = 0; j < 6000; j++)
+ }2 O! U7 n! _4 g {4 m4 L! _; w4 a, t
std::generate(vec1.begin(), vec1.end(), []() { @( q! Z1 @5 ]3 W! f1 I! S
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;; T# P$ j4 _4 b' G1 O J
});
) k$ s* Z, t4 B2 L2 G1 h: q3 ]: j8 J3 M% ?& E" S" {* T. ^& u4 f
std::generate(vec2.begin(), vec2.end(), []() {
0 f# X. G+ l- m. i: |4 F) L return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;( z7 x: e* J4 G, X, L. Z
});
b5 o% B5 K, q$ v
, [5 X/ d/ T% t6 c8 r1 D" H for (size_t jj = 0; jj < vec1.size(); jj++)) t+ s; Z, C% m; l: ~' f
{+ G- e6 N7 R7 o& q0 g
b1[jj] = vec1[jj];9 `! }1 Y" E% C1 X
}
6 D7 F6 e6 R% e h/ y6 w/ V
% [4 r: @+ Y9 p! o) Z7 [# ~1 \: I, n for (size_t jj = 0; jj < vec2.size(); jj++)
, J- F; y9 a$ R; n/ n {
3 `; f t* R5 x5 x b2[jj] = vec2[jj];; R. H. J! N5 y+ _/ a1 `
}( ?: E3 R% g7 q8 D" V0 w
8 G2 G1 M+ w r, r# [
//Method - 1 N=100000 247s
; i3 _( s; S u9 X% e //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
. q( H, O: L2 u" |# M2 t" @ 6 T3 T. _% ~+ Q- Y/ W2 u% [4 h
//Method - 2 N=100000 237s: N" W% I: O q: |% E
/*$ r n, h) h* u) O5 V
for (int jj = 0; jj < N ; jj++)0 P9 E% w! r6 `# W
{" ^" J, c" ?9 S0 q ^% [
fresult += vec1[jj] * vec2[jj];- O8 }& y0 {* q5 X& ^3 j
}- C3 i6 {7 r! O k& c
*/+ q4 T6 e E, V( t/ L% _1 n8 w
" h$ B' C% I( ^: [ I& o //Method - 3 N=100000 204s
# R+ x4 g9 |: G2 f% I* c7 i# [ /*
2 T( m! F) T5 @% |8 m for (int jj = 0; jj < N; jj++)2 v! d* a/ F' V) Q o/ c8 a) f! Q+ F; r
{8 [* w/ D4 A$ \: h* K
fresult += b1[jj] * b2[jj]; W* s6 x8 b: I) s$ l0 M
}' Z2 Q1 d- u; s7 ^
*/
( r0 _5 |* k6 j+ t8 T& Z5 ^
" O: s- }; P" ^/ B //Method - 4 202s
. A- ^% v4 `4 h( U! B- N4 U) ] /*
0 F i% t7 Y8 W" p& e for (int jj = 0; jj < N; jj++)% t$ R( _5 Y2 Q) T/ D8 U
{
2 H# r1 l5 z. ^' N4 H2 Y/ X
- P9 V: c% P6 P }1 ^$ N; Y$ _8 c) t) v8 H1 t3 P
*/: b* A0 U4 r9 C& a: Q6 z& z
//comment out all methods, N=100000 202s 8 @1 y& A; ]6 {; J' L. F
}0 _8 T9 X- i) f$ Z8 ~
" _. i6 V4 Z" r9 X4 l6 h delete []b1;
+ Q: w& |$ j/ J1 e! L delete []b2; & o" a3 b& q/ {3 x
|
|