TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
, s4 r% i" n1 F c& ~0 l7 {
5 Z8 p9 L- T5 u& i1 H理了理思路,重新做了一个测试。7 F% S3 V# q& m
做了两个 vector 和 两个 float *, 都长 100000
+ |; Z1 r+ }: J* ]' { E& I外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.$ e2 \9 F" l' N; ]! e* h, T
* i/ }5 F, ~. @: }* w: B" w内循环试了4种方法,& k" @; ?4 F! ?
1. 直接调用 vector inner_product 247s + @5 B7 t8 S# z& I$ p4 k
2. vector 循环点乘累加 237s
7 F5 x9 G6 i6 e3. float * 循环点乘累加 204s/ x1 k( _% j; y/ v
4. 空循环 100000 次 202s
. _4 `/ P9 m% D0 x1 T. r$ z7 v6 F0 i& ^% D3 z
不做内循环 200s
, @5 Q/ D) J0 X9 a$ r3 \& t, K; j$ D0 b6 T; G0 H; V
你昨天说的对,内循环本身占比是很小的,大头在其他处理。! J% A" E3 o2 b: X' e+ Z
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。8 B+ R& [5 z* L
/ k0 H$ | b- l0 T% H5 G- V至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试). B* G w* ]9 i! Z# e7 p* h
% D$ H V" Y% r8 C9 B(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
4 S0 t5 @# _! s* ~8 C0 X3 H1 h
" W- j2 m4 U6 d {; j std::vector < float > vec1(N);
; S" r/ w1 R; m, a; R std::vector < float > vec2(N);
+ v0 R, |) g% C- n4 U9 \ float* b1 = new float[N];, q2 N+ ` ~/ m. c# n+ z* _) n
float* b2 = new float[N];
: I, I" a# }4 V& G" E
) C. I- `$ }8 |( D; e2 g; Q2 l for (int j = 0; j < 6000; j++)
7 R& F* S( N% f9 y8 D% D# H4 P- ] {' @+ M1 S- z+ k" q, j S
std::generate(vec1.begin(), vec1.end(), []() {' a& b4 B, f7 z8 n
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;' C7 d: o( _' q% m
});
) k9 Y+ Q# d( @' G/ L! t: o; j* ]. F) g. b8 L1 f
std::generate(vec2.begin(), vec2.end(), []() {* V( `9 D" Q' u+ S p1 H4 N" i
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
- ~! {& J5 w6 g0 F1 k& g });
# \1 w* ~# J* z6 L$ F. Z% D: j" s& [7 p& G% [5 D7 E9 r
for (size_t jj = 0; jj < vec1.size(); jj++)4 J) N- S4 o" I& U( l5 A
{
! e2 B5 S" `' z* U b1[jj] = vec1[jj];8 K& Y5 ~0 w& V; h: q
}: E5 o8 Y0 S0 d; E! C
$ t0 C1 R2 Z! B. p# G: y8 @+ W
for (size_t jj = 0; jj < vec2.size(); jj++) V7 {. X6 E" i, l! \
{7 [, w% x D( s w! f! x( o
b2[jj] = vec2[jj];
0 \# Y* S% u8 |) O2 z }
5 I: d5 z3 X7 M( s
! Q. W5 Q0 D7 J7 t) R$ F+ J //Method - 1 N=100000 247s
! o: N- ~8 d( w8 D. ~3 h4 ` //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);: i! z% R- Z7 R- m( r) E
1 _9 _3 m v9 N4 k. w+ B
//Method - 2 N=100000 237s$ U# j0 t) G: Y7 T1 S& }
/*7 R# c* ]$ G+ @: T
for (int jj = 0; jj < N ; jj++)
" T" T+ s& R) V4 F1 H5 j {% }9 O7 F# G0 J' C: L* B4 \* e2 x
fresult += vec1[jj] * vec2[jj];
( u1 B1 U5 H" D/ c& e }
/ ^: ]' d( K, G% I */
- L! Y% ?* ], f* z4 l. P3 f; q1 n + I3 l* R: g% `& z6 I" V
//Method - 3 N=100000 204s2 f% E: R" G1 T6 o4 ^' T E
/*
( Q. F: J3 T2 |$ t) @' S for (int jj = 0; jj < N; jj++)
8 ]# A! e" t6 J* e8 q% o {7 [6 b+ U- Y, K/ L0 [1 W% H" a4 b' c
fresult += b1[jj] * b2[jj];
! a7 Z$ M( @5 a+ ?: m5 v- G }& K/ A: `8 t ?. y( s
*/9 u% k! x$ _ E
% q/ D: b; r* C
//Method - 4 202s, m5 E+ ?, M% w$ ]& R. \
/*
: L, u5 _; @% T& d2 {! W# `. } for (int jj = 0; jj < N; jj++)1 D/ e" l3 R. ~2 p. M
{9 ?6 L/ R2 c4 X
/ ]$ }- z' h9 Y8 I }
( {& R+ o$ A% y$ n */
' e2 H3 j3 W. l1 @ //comment out all methods, N=100000 202s
" D$ n# I% G: z/ f) N# Z9 @1 U }
7 b# t; @: g) B7 f
3 |0 n L7 g+ g% J, y delete []b1;
' i& V, Z$ ]# n" | delete []b2; 5 e+ m" r, C7 L* v
|
|