TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
8 K+ C& l) h, i, L) N( n- p# c) T: t* m
理了理思路,重新做了一个测试。
1 I% ?4 @4 b1 Y8 R0 F) d做了两个 vector 和 两个 float *, 都长 1000003 Q; I# k/ J3 G0 ~ y8 n- M
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
, I8 ~. j) o" r+ F" Z h5 Z; x% X7 z% \; w; o
内循环试了4种方法,
s3 D% P' d# y2 c/ }; ?1. 直接调用 vector inner_product 247s 4 p4 } ]( y: i* S. G B5 n5 E
2. vector 循环点乘累加 237s' A, l! k5 [3 e2 N
3. float * 循环点乘累加 204s* {$ Z& `* P0 q* J8 ?' F
4. 空循环 100000 次 202s
% w; U( l1 p$ i
; M* [& G6 {" W7 Q/ D/ E F) `不做内循环 200s
% _1 O+ M. C+ B7 u4 y( K1 K
6 d4 G9 T& G+ A- A1 f3 f你昨天说的对,内循环本身占比是很小的,大头在其他处理。2 F$ k) ]# Y* V0 c$ D1 X
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。- G, Q9 I; A4 P
' h3 a- q0 T6 n5 l: d至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
" ]" b, |1 ?* m4 j6 |7 c6 g' s$ t8 i! q9 Z
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)0 n7 i1 ]5 o m% ?5 V$ e4 P# I* s
. n- G, O5 Z5 u3 g1 x& [3 E std::vector < float > vec1(N);- p* z1 \; O( r6 x0 X
std::vector < float > vec2(N);
# X5 q" u! S4 t" b) A; P4 O+ C, z9 L float* b1 = new float[N];% ~+ _+ r Q; z5 v# u8 o
float* b2 = new float[N];
$ y8 m) ^" r( E% Z3 \& j# h$ n
6 l$ O& S" |; ]! { for (int j = 0; j < 6000; j++)
7 O9 h7 @9 N- h2 T2 b/ @ {% n- D3 W% e. c9 i3 h+ }$ `
std::generate(vec1.begin(), vec1.end(), []() {
# Z) B, W4 }# g- r return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
. i- H* i& G# i6 n- N# K; f, R });! J( t) \+ v& f# \! \
- [8 C% t& w4 u5 p4 J) ^1 Z
std::generate(vec2.begin(), vec2.end(), []() {
& V' p+ z- g% T: R3 R return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
8 |4 J: x2 H; j( y2 a });$ l2 K8 }" o( ?. M' z$ S1 c+ w
: s( G- z/ B6 t8 L! c. T$ ? for (size_t jj = 0; jj < vec1.size(); jj++)8 z* L+ A6 y, _) \& Y
{# s& P# k0 O3 C1 f' J
b1[jj] = vec1[jj];
8 v8 M3 _; U( D: a }/ k2 S9 `4 \( I2 {% ~1 \3 _
+ x* a/ k: D5 K' y; H4 o! r for (size_t jj = 0; jj < vec2.size(); jj++)
; K8 q. t# h8 e. X0 Q2 Z {
5 `0 g$ r9 u' }" n3 L b2[jj] = vec2[jj];
9 p$ S! s! P% a0 s- t3 }0 B }
+ C/ L7 S# ~, W8 [) g. y0 ~3 O9 `% [1 w4 ]% {9 b
//Method - 1 N=100000 247s
8 j! G7 E6 f5 }9 h# V' X //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);3 D, c8 M! J6 b3 E. N: w
7 P- b0 ~0 {0 m7 n //Method - 2 N=100000 237s; I" l# t0 a/ ~( V( K
/*
/ Y. D) g: I. T; |, i for (int jj = 0; jj < N ; jj++)) g( b4 p' f, A J' w) I8 M1 v
{6 e" Q5 g) u& q! G7 i: }9 v V! x
fresult += vec1[jj] * vec2[jj];
8 N1 a. `1 E5 f4 M p1 g }% S2 \) S) Y2 [' C+ G
*/
: \' Q9 \9 L: d, d/ o% l$ L 8 r) o- |! k& K& o$ N K' H
//Method - 3 N=100000 204s, r$ g2 ]6 ?2 I6 G! {9 z
/*
( x- Y. T! Y9 G+ o% J4 p for (int jj = 0; jj < N; jj++)
- w7 y+ a! l' D$ Y; O7 m2 ] {- k Y4 {. g; z% W3 A
fresult += b1[jj] * b2[jj];2 Q0 c/ m4 s1 g1 \
}+ H0 L( y, ?2 ^5 M
*/
" h6 n1 Z1 c3 R6 i" F8 t# j3 k4 g% G. ~9 p& V7 @
//Method - 4 202s
( t0 G1 V4 b: c/ T. Y. B /*
; U2 i; J0 t& z for (int jj = 0; jj < N; jj++)
; [/ R/ L- ?' d: f/ X7 z3 q {8 k# k- _3 K1 W% W
A: ^$ E/ j2 O4 d
}3 F- U0 q0 d$ Z, v
*/
- |2 z- l8 }* w //comment out all methods, N=100000 202s
. k3 w1 U( T, t. M1 V' f$ M }
) | Q$ J9 j5 c: R6 F* z2 d' i7 F- y' g5 n# V) X3 i
delete []b1;3 U |/ y0 h1 T! {$ f
delete []b2;
8 J6 J& ^8 P* U7 R8 w" { d |
|