TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
* D( u$ D+ G; n0 z1 x U( [6 a' [ }) L
理了理思路,重新做了一个测试。+ t- y6 `" Q; H2 }! b& F' q2 V
做了两个 vector 和 两个 float *, 都长 100000
- }7 p; x: j) `9 u外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.! I8 @6 ~% q: p4 }( {) n; p% u c
1 b$ p1 s2 w0 b$ C" O$ X
内循环试了4种方法,
- g! l. ? U7 y# O1. 直接调用 vector inner_product 247s
0 s* J$ k, N) O0 M5 s2. vector 循环点乘累加 237s
$ C% f4 r' f& g8 Q3. float * 循环点乘累加 204s
' R3 T; P9 l- M6 l U% D5 o4. 空循环 100000 次 202s
+ K; l- v; g# A9 s0 P3 g# t
2 u5 r8 r0 N! p6 V- [3 l( q不做内循环 200s
) d3 M& A, n; B, V5 R/ I: Q! {# e, y+ o, o6 ~
你昨天说的对,内循环本身占比是很小的,大头在其他处理。' k9 j+ E9 g" s. L1 h; {1 w
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
7 z; W7 z2 g5 z6 |; k9 l/ R% e0 v- R# `1 z# ~( T3 d- a: V
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
( p& s0 L+ Z3 `7 x5 |2 R4 G0 D& ~1 @- R! m2 K }
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL), F. _( ^/ v1 z$ @5 c/ C
. k \( S, m6 _! O9 I, u+ W8 F
std::vector < float > vec1(N);
3 r) W9 Y8 Y0 V W" Z$ _+ r! E std::vector < float > vec2(N);
( W1 x* v- A+ C! ` float* b1 = new float[N];( F. `$ L/ `3 c) @3 N, D1 w7 o8 R5 X
float* b2 = new float[N];
) V) R1 ]9 z. @* q5 ~5 M/ @" a& m- J0 E, G: E
for (int j = 0; j < 6000; j++)
0 G6 B# G7 F2 A9 w/ { {" C( z# ?3 t! z8 |
std::generate(vec1.begin(), vec1.end(), []() {
t" }- M8 }, i2 ]0 D return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;- J* A' h' m7 b3 u( P- {! P
});
" q% q+ f( E+ V" `. i+ m6 |9 _7 U( j- z/ L: _
std::generate(vec2.begin(), vec2.end(), []() {
/ _* r/ C! P% w! } return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));; r& v* I K- }1 e
});
0 g* s4 ?% `: ]" V1 X i O) s$ R+ |7 T. o1 {! V: [7 G3 T
for (size_t jj = 0; jj < vec1.size(); jj++)9 }& Q+ t# W3 Y3 n: q
{
0 M9 s3 \/ [; O. @# G# n b1[jj] = vec1[jj];
% _+ I' z4 x- {6 B# e) P& E }7 Y9 b0 ^9 l' v3 }6 P
n% w/ w' b* b6 t' E6 Z g for (size_t jj = 0; jj < vec2.size(); jj++)2 Q% p0 _4 `. ?' [" t
{
7 [: ]% e( B+ S& U9 ?! } b2[jj] = vec2[jj];
5 _) [. q( m/ r9 q1 K4 R }
/ I. H! r A3 F# ?! b4 x: k$ @+ M- A% L) N. Q% r0 E! C
//Method - 1 N=100000 247s 3 E1 @- H7 s6 h r* H4 c
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);1 D% A. [* C# D2 d6 h
( D5 z8 S S- A% j/ ? //Method - 2 N=100000 237s8 X, }9 |3 k4 f& Q& c" d: \
/*: y$ O. F) U$ L# H( _5 v0 i, F
for (int jj = 0; jj < N ; jj++)
* K1 W9 h4 u3 G5 \" V {
3 G8 _& C) E; k% q, P D fresult += vec1[jj] * vec2[jj];1 ]* t, C+ X. O; [6 U
}
8 f$ @. i k1 d */
+ |$ Q% k3 c; O 5 @9 [' v. R/ x9 l' l
//Method - 3 N=100000 204s
|4 U3 v3 K$ I; F5 R /*
0 I: I2 c8 B! H1 e$ b for (int jj = 0; jj < N; jj++)
~/ x# S7 U9 b8 M/ N {& X( b; O6 C' m
fresult += b1[jj] * b2[jj];9 l+ K( ^3 b8 A: P
}
% s' _4 n- |" m6 p0 t6 W6 Y4 c */
& U6 f7 W7 d$ n4 {( t/ [2 c' v: G% O; S: \: a0 P! z
//Method - 4 202s
- i+ ~4 x z3 x, f3 S* t- [& _ /*3 }2 C1 l7 L5 L4 w* q6 T/ g
for (int jj = 0; jj < N; jj++)( Q+ v" [" ^, C6 T Q# R/ [
{ E h. T- e! w4 H2 [3 N. v5 W7 S! K1 R
7 @7 N6 {, V( c }" [7 l7 k% k- b3 U
*/
/ F) G3 ?2 h: Z. U) U7 G6 V5 w2 F M //comment out all methods, N=100000 202s
! m9 |( q S; P# R; o/ o) f }* D4 I( |+ M% s0 b- k) K$ A1 u" j
1 V* G: Q, r$ y7 `6 X S7 r delete []b1;
7 ? G1 [, F6 I4 b( A delete []b2; 8 a# w$ @* f1 J" @
|
|