TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 7 o0 d" ~7 p% j
2 V7 e3 k- S5 d理了理思路,重新做了一个测试。
! p6 P5 P" a* l& F- A, B做了两个 vector 和 两个 float *, 都长 100000
- ?' ?1 k( D1 y0 G1 ?7 L9 b外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.9 ~! I, _1 n# m' A3 E) {& K
' } r: [' t. a4 p内循环试了4种方法,
( G/ k" ~! q3 r0 k1. 直接调用 vector inner_product 247s
8 \6 u! t4 t0 |$ ~7 a2. vector 循环点乘累加 237s
4 ]- J+ V( o" V3. float * 循环点乘累加 204s. b; q: I& _' }/ ?
4. 空循环 100000 次 202s5 q0 n/ P# L2 V5 O
: s, w0 K7 [% U$ `: J* \# e3 g不做内循环 200s3 j- r" i n& t: R0 s* h
9 s- E& Q+ _3 Z4 m* \4 w1 B你昨天说的对,内循环本身占比是很小的,大头在其他处理。
: S2 a: l7 O% J; [ G" e另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。 `8 I! Q$ K9 h7 v' k! \- s, i; F5 t
, ~& m k O" g$ w$ b" Y7 E至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试): s0 n2 c# O1 D4 Z+ D* q/ H
9 [0 [' p1 K6 i+ \ e2 U(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)6 P' e- b; \/ O! N9 x& Y
" @& W: Y2 S3 s0 a
std::vector < float > vec1(N);: a+ ^/ n+ \+ t' X
std::vector < float > vec2(N);
- q7 g( i. T# J. T7 H5 M float* b1 = new float[N];
5 ~5 z8 Y. C3 p- s$ M' E) Z float* b2 = new float[N];
4 s0 s# T7 ?: [+ {8 _
! {2 w; E. L: H* a1 H- ^1 L+ L for (int j = 0; j < 6000; j++)9 ]0 u) C& b( [. Y/ B3 D8 W
{8 A9 C, f2 I- \" _
std::generate(vec1.begin(), vec1.end(), []() {
. X9 a5 D- c7 Y return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;( v# |! E1 t; e+ s6 j, _/ g& y
});
8 |0 C5 x& G8 {! i
1 d+ D: N6 Y6 A- x std::generate(vec2.begin(), vec2.end(), []() {
7 F6 n0 [4 H9 x) V return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;; R$ j# o1 W5 O4 e! ?
});
( ]) A% ?, P7 v; X: ]- X
1 b2 D! D; D, M7 ~7 U( s for (size_t jj = 0; jj < vec1.size(); jj++): d) \4 g/ g; D2 Y' Q2 ]9 M j
{/ @" v0 W, C/ g% G! @+ A7 T
b1[jj] = vec1[jj];; s" X* j2 a5 h) V5 x0 z
}8 |: ^2 H1 V2 O& A5 ^
* e; W1 Q; S( s" I
for (size_t jj = 0; jj < vec2.size(); jj++)
! D- m- ?% s- ?6 F3 o {) o% k4 t$ A4 N! h7 I
b2[jj] = vec2[jj];
1 U( C. p* h8 A }
* C6 @5 z/ ]6 x c! U3 i/ [9 a9 |" V' i" O& C% t( a1 Z% o
//Method - 1 N=100000 247s
9 y; \% H( m6 b' T //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
% J8 D6 A0 e2 P+ }1 W' x
) g& U0 u J8 \- j& t //Method - 2 N=100000 237s
/ x/ R0 h. b: C7 r) ]+ J /*7 ^% v& M7 o$ `& Z% v7 f
for (int jj = 0; jj < N ; jj++)
6 I# N9 Q1 d# F) |5 P* d {' |; U7 C5 P# d* {
fresult += vec1[jj] * vec2[jj];
& s! v6 `: |% v }
, w% A0 V% U8 }9 J1 X4 v1 f) s */ P1 Z" u' q R) q2 ^" J# w
8 r1 p( s I, Y
//Method - 3 N=100000 204s
$ r% E6 [( R C /*
9 i5 I) d5 r0 [( V1 `# {: C5 A8 S for (int jj = 0; jj < N; jj++)
$ A$ e7 ]4 R" T p- T& A# B {
% n: T, f" M2 E' Z: R fresult += b1[jj] * b2[jj];& z) m( Z$ |$ j7 ] v
}: S; r5 Y" \7 t, \, ?0 E; J/ v# u
*/# R9 l9 t" S! L1 {
4 j3 H- w& ]* ~! B7 P8 V8 L6 N: W
//Method - 4 202s
7 I* L# q- S, R& v /*
$ p' s- ~- n3 o for (int jj = 0; jj < N; jj++)
1 p) x! H: I; u {
% _5 }8 H0 e7 \
0 }9 ]6 ]1 U \: r5 S1 t }, t l1 x L* f: z
*/
. C6 s o9 y+ w G( u8 u //comment out all methods, N=100000 202s
0 T+ b: s( Q$ O( ?$ D& H# l" t }, o# k2 X4 f' p% c3 K
+ |+ \, T( A1 G2 A/ J2 ~
delete []b1;
: k, i' _, c2 Y4 F# m( U5 K delete []b2; + @$ I( X& m7 {$ D& k1 D* x
|
|