TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 9 H( J/ [$ m5 G: S" c6 T# E
6 g2 b, k- A1 h6 s
理了理思路,重新做了一个测试。0 [9 H8 a+ S* m# H, z. b
做了两个 vector 和 两个 float *, 都长 1000000 j. `- O4 q9 c: ^+ Y" g
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
/ M4 g4 a0 P( V4 R* p f+ U& f1 ~) e# x7 s8 [6 C. W/ E
内循环试了4种方法,! V& Y, \5 a* }6 \7 f' a
1. 直接调用 vector inner_product 247s
- z, ]7 B/ }0 X5 ]% P! e( y+ K2. vector 循环点乘累加 237s
- K9 ~/ c0 m1 ]+ X3. float * 循环点乘累加 204s- S# t; q2 z5 n5 `, d
4. 空循环 100000 次 202s3 e6 r$ M5 F3 H( S4 i2 I
+ d2 i2 c& m$ C2 p' ]
不做内循环 200s
: N' u4 m9 N; k3 ]5 Q
1 _1 b" w$ M+ }: X你昨天说的对,内循环本身占比是很小的,大头在其他处理。# X! T8 U( U, G+ m# M- x% q/ W8 d
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。( }; _7 `7 q9 @5 ?
4 P0 h5 M1 R. f& b# n) I' E, x z至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)- X4 Q9 I0 r" L% F8 {7 X8 B
6 {$ q A5 M, l. S- q+ M5 v9 V" ~
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)+ _5 g" Y/ h }9 M
: C8 d2 u% G' i! ~- F
std::vector < float > vec1(N);8 H( G' K+ N7 k! w
std::vector < float > vec2(N);
+ F# N; P! H# V" Y: v) V/ s float* b1 = new float[N];
" e g, N/ H' q2 N5 ~( {7 s: m float* b2 = new float[N];' s. f, d: B# u8 k. m+ |# f
! u+ M, p2 |3 b# N& w# p: ^
for (int j = 0; j < 6000; j++)" G/ r+ y& I6 H# L1 b
{
+ P2 m0 B. F4 i" o5 T* R9 j3 z8 j std::generate(vec1.begin(), vec1.end(), []() {
8 @: _2 j$ U5 s8 a* } return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;+ Z) Y* Z/ d8 D
});/ i& }7 t; t5 {' v! g. j( V
; Q0 g$ {# c- I* x0 p& v$ S$ i. M std::generate(vec2.begin(), vec2.end(), []() {2 g+ s9 V1 P0 g6 y5 F
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;7 f( V S& V/ w) J7 m9 D. S
});
1 t9 c( m* K2 S4 W) _0 |" f! b9 Y9 W4 f" l: O
for (size_t jj = 0; jj < vec1.size(); jj++)4 g. b8 \ k0 [
{
Z8 K5 `" k5 P$ U* d* |8 r) `* ^ b1[jj] = vec1[jj];
: G# }8 j' F$ O }3 ~- e# m9 j5 A0 K7 C
; i* T2 v. \ l/ S/ Y for (size_t jj = 0; jj < vec2.size(); jj++)
4 |5 p8 {2 j8 D$ g- J3 z+ N2 x" i$ j {
; r1 c1 j! u* U/ R/ p b2[jj] = vec2[jj];
: q: G+ s3 {+ d }1 w! V, r$ p+ n3 c# ?" |' @9 I/ G, _. L: s
+ |* j) l) U7 e: M0 {
//Method - 1 N=100000 247s " `4 F! i$ o- K
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);$ t( L. w; G: `- d6 V6 x. \' c) G' h
4 ^4 E p& J+ J1 N0 E
//Method - 2 N=100000 237s
# L8 Y, }; a$ A3 u4 u5 R9 }& d* H& S' i /*1 _- F3 T/ ^* F! U
for (int jj = 0; jj < N ; jj++)
: O3 s: V, x1 W+ `) r {% g3 ^0 T! H+ u D0 D7 l/ ?4 B
fresult += vec1[jj] * vec2[jj];
4 M3 }, e+ i$ j }
$ @8 `5 v) j: Q */6 N' m4 W6 i3 Q# n3 Z
# H+ G8 @2 n1 B6 b, N
//Method - 3 N=100000 204s
" O) P. a. t7 Z9 d. E" c /*
0 U3 n/ ~7 u( [4 V& s9 | for (int jj = 0; jj < N; jj++)* T p& e4 a8 x2 h0 f7 G( c
{
3 t; G& S9 A$ k, U0 a# a fresult += b1[jj] * b2[jj];
2 J+ |8 _, j# h- t. q7 k4 W }6 K& R" i) M% x; P7 ?5 W
*/: }! P) l/ z0 k$ q( ]( n7 U/ B2 Z
1 T; t- j6 L5 f# _0 r+ w$ i5 a
//Method - 4 202s
0 h8 G4 b6 l$ n" q5 l /*
9 H, ?& s3 n" M9 l m2 R for (int jj = 0; jj < N; jj++)
& Q3 a* @# F. f7 b1 b1 \6 b% ]5 e r {# T; u9 H2 f/ U. q, Q
4 c: U& y; j, F) P9 b }' m; U- i* ?3 X, o1 d7 G, A8 A
*/
, _0 g7 S7 w2 a" y2 R //comment out all methods, N=100000 202s
7 }, u* S+ f4 c% ` }
9 B) Y+ p5 B' ]( Z9 J- ]& e' ]! U2 W* R) X: W M
delete []b1;9 f( m% f, y+ n6 S
delete []b2; : T. ^3 k8 U" z s) U
|
|