TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 # i9 A* {" a/ G2 N# k* b; b
8 ]1 l; P f( u3 p3 E
理了理思路,重新做了一个测试。- g4 ^# P( G2 z: z8 S" }) T
做了两个 vector 和 两个 float *, 都长 1000002 u% w; ^0 y/ R& ^. `/ E
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
) [* ]3 N- Q2 O- ^7 G& ?9 e0 d' A$ `$ l0 u8 K/ |" l9 i# Z2 T# T
内循环试了4种方法,
0 ^. W, Y" t& m* _% q1. 直接调用 vector inner_product 247s
, {9 I, O0 h4 p& i D# R& ] e2. vector 循环点乘累加 237s
+ r1 o: m2 g, U S% Y* y3. float * 循环点乘累加 204s
0 D' ]$ A& P6 Z' A _/ i& I4. 空循环 100000 次 202s
* K# i( C+ d8 ?4 K' f8 h
, U4 o5 }" z6 {$ y0 F/ y d不做内循环 200s
' Y. v1 N: K) `" x- l' X* Q( `: C8 u# B" o
你昨天说的对,内循环本身占比是很小的,大头在其他处理。0 l7 B3 e- W; S/ t. `! Y
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。/ e' b" v" V+ Q0 P& Q
3 M, B: i; F @至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
8 x2 J0 f& Y) \ x9 `
) G1 M5 N+ ?; y5 V }$ y8 I; R" U7 P(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
, C; l0 u! k* P- @& ~
4 d8 y( s5 y1 a% X std::vector < float > vec1(N);$ G+ B4 H! W$ z; G7 L
std::vector < float > vec2(N);
* K0 ?. R$ b) q& `' _& H$ P float* b1 = new float[N];' G# U" Y4 ~$ d3 j4 T6 r+ L
float* b2 = new float[N]; D& {/ C3 X7 n2 _& l) c; m" s- _
# M' e& R$ f. e4 @ for (int j = 0; j < 6000; j++)
6 r% R+ r! a E- n {
' [! a4 G) C4 F, S) u2 Y std::generate(vec1.begin(), vec1.end(), []() {
+ _" P: E: G$ J5 I7 j& Q6 B& J- A0 v return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
5 a/ {( D% w! D4 p" L( ~' w y });
" U1 ]; k# u7 y) T5 X$ C5 p; r# W! [7 N8 {4 ?
std::generate(vec2.begin(), vec2.end(), []() {
! Y0 T3 D* H" \2 ^ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
+ \) t2 |6 u. ~; b/ q0 Z' W });/ K, E& Y0 \+ |% I' n
. x/ t( V% d+ w4 j9 |+ ^; W for (size_t jj = 0; jj < vec1.size(); jj++)( S4 a: s$ z s. c5 S. o: y
{! W5 h; v/ Q1 L8 u$ T* ^
b1[jj] = vec1[jj];
5 `" _8 `" c. v; Y }
Q# Y. a# r L! c8 [, A8 A
+ E5 w% U* w' e2 G- P( Y( U& H for (size_t jj = 0; jj < vec2.size(); jj++)
5 l# S% Q1 V5 l# h; q {1 ?$ i/ C2 B: R- w k8 b1 p
b2[jj] = vec2[jj];
* X- j: P4 A1 ? }
* B; a6 L2 V \' G" k8 ?
1 b& Z! a& D+ A //Method - 1 N=100000 247s
, i( b+ o+ A, ~" g5 i- w //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
! P( M' e6 a5 x' P 7 s1 V" b( ^+ ]1 Q/ ?9 Q) H
//Method - 2 N=100000 237s5 L7 J( Y4 l+ b5 X% ^7 @& w6 a0 ~
/*
; z* t0 Y1 m% A) n$ ] for (int jj = 0; jj < N ; jj++)3 B) b9 @! J, o9 Z0 i% N b
{
8 Q$ |0 n$ O) M0 p# \+ y# v- J0 g fresult += vec1[jj] * vec2[jj];
+ R( A: A I, f- @0 K/ e4 B7 Z" j$ u+ A }7 N5 d: y8 F7 }1 I/ }$ @
*/
6 G1 w$ R D2 i * G( ` j6 D1 V$ Y6 z! _
//Method - 3 N=100000 204s8 p2 C6 i' V/ U# {$ E
/*
! [6 N- X& k. X, G' F# p# ] for (int jj = 0; jj < N; jj++)
* _/ y9 R5 G `2 ]& f/ L5 z {" R7 l; q1 T: R' f2 C) w9 p" O
fresult += b1[jj] * b2[jj];+ T3 ]0 I9 m5 l" Q/ ?4 n- E; \+ N
}! Y- y2 R) C3 \2 O1 ?
*/
" @) Q# L0 E# a# X G" [. B, W
//Method - 4 202s
% e: t" @4 S% A/ y6 b /*
- b: X- W% k. e% s! i' A2 f$ E for (int jj = 0; jj < N; jj++)
1 d/ j |5 N& ^4 q( B: ^ {3 Q& |5 r, U9 I/ @2 k7 _6 [5 e9 s: U
5 `3 D0 w. K0 t& e8 }" B }9 u) e2 F- R* l7 G: ^" B$ s
*/ @' w! D+ F/ M) A+ @
//comment out all methods, N=100000 202s
5 a+ k" m d; F% ] }
: ?9 N* Z9 C5 o2 q3 k* g2 W8 G u3 C9 P( A" q( H- c
delete []b1;
7 N( _9 T6 E# M$ c& q$ V& b delete []b2;
& w' E# b9 \& d; f |
|