TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 : x2 V2 O8 \7 r
7 f l- a: i/ ?2 K* R; j
理了理思路,重新做了一个测试。
' O% T& _) p# @4 t5 s做了两个 vector 和 两个 float *, 都长 100000
' i3 Q% M5 Q( N- _7 F$ {外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
- u. R; M Z* A
5 n6 G6 ~$ H- }/ x& R, G7 B" ]内循环试了4种方法,% u$ x, J% N1 O3 y: a8 ^9 |
1. 直接调用 vector inner_product 247s ; Q; K( q1 d" a; c: y6 b
2. vector 循环点乘累加 237s) A- T* e/ B1 t
3. float * 循环点乘累加 204s
! ^' ?, @# R" S8 r4. 空循环 100000 次 202s+ D2 q6 G3 T4 d4 J) R. T( s
0 [" O A) J0 \5 Q9 ^# o6 G; }' a不做内循环 200s3 q: L/ e" h4 _& C4 ?
, U2 e; S' |) i' Y/ W
你昨天说的对,内循环本身占比是很小的,大头在其他处理。) L8 C& s6 h' l9 i8 y6 b6 U
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
8 t* B9 M* }3 A5 S6 r: o
& |6 v/ m- F$ F至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)- p/ F- b7 i% L1 r$ X3 j" T
6 I7 f- V9 ~. [& Q8 \
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
0 W: u$ W' S; V5 y7 L4 g, F% N; v! S; x: l* q- y7 n7 ` ?
std::vector < float > vec1(N);0 A* m9 x" H; {
std::vector < float > vec2(N);+ N$ G. _4 ~: f/ e
float* b1 = new float[N];
, M) R8 {4 e+ I2 A# J; z float* b2 = new float[N];1 \1 ~, T0 Y: b: K8 \; J
2 D' h0 |! d9 F% l for (int j = 0; j < 6000; j++); s, Z" d, R' H: }: L8 \6 ~: ]$ c6 J( g
{- ?3 C& u# `* E8 f! {) F
std::generate(vec1.begin(), vec1.end(), []() {
; g7 N4 `4 x7 K4 V7 e1 q4 Q return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
# X: c T* `& e' x" P/ A* ] });
- B$ m5 J% W3 H( d
, g; ] K+ B2 J3 F4 S/ E std::generate(vec2.begin(), vec2.end(), []() {
6 ?# c. `( T; m2 n return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
1 d1 m& K) I4 Y5 w! v });
+ h: o4 y$ E' D. E/ M
7 Y; j `! I+ S" @9 M for (size_t jj = 0; jj < vec1.size(); jj++)
' x' o. _/ x8 W% @7 ` {
) Q. ~; V6 m7 w' k2 [$ I Z b1[jj] = vec1[jj];' A/ \. @, Y$ L) ^: b \" `$ S) [# t# M
}4 o" S0 y# q; h. F
) d% u6 I/ u- {5 \% B/ x
for (size_t jj = 0; jj < vec2.size(); jj++), V& d& m: A" e& U/ Q B' T8 O
{7 L0 {; ?1 \$ G7 k, C
b2[jj] = vec2[jj];0 O( ]; D+ a7 X! `& t) C- Z# a2 _: K% ]1 H
}8 V) R7 B. ?2 p: p2 q$ |" r
7 @, _" R" Y* H* _ //Method - 1 N=100000 247s + R5 l2 C' k/ P
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);3 z& Y5 b6 k8 v* ?+ j7 R
V& }1 v2 E9 d) s7 k //Method - 2 N=100000 237s
* X, J, S" k( E5 P$ X4 S: D /*0 P& N. C! Q/ a/ i# t V# a
for (int jj = 0; jj < N ; jj++)
6 y* b& z4 q8 q {
3 V! E$ H! l+ T7 L' `6 ^0 d fresult += vec1[jj] * vec2[jj];
- s& p7 F) s' V# A: h0 p }& g @( Z' F l9 X, h; C
*/3 S$ K* l4 ~1 A4 q, o3 C
+ t, b/ w/ k' s5 V+ }* Y2 A7 F3 G
//Method - 3 N=100000 204s
* Q8 Y0 z G( \/ i7 s /*/ Z( _7 j# ?/ O7 [2 f
for (int jj = 0; jj < N; jj++) k2 O' t0 z/ H2 |
{$ B7 _- u9 B) G1 \9 C* `2 H6 ]
fresult += b1[jj] * b2[jj];
$ W+ i' k& A+ o1 j' | }
1 h% g4 \3 D5 H$ x$ @ u" H */
: a' O# l/ \: _5 C6 P* R6 e& `
1 c a: _/ B; \$ |& c& u //Method - 4 202s- w% N/ j4 z4 j
/*
4 K- K$ A; t, r- g! } for (int jj = 0; jj < N; jj++)
1 G0 D" A! [* p- a$ Q* m {
3 V& G- N9 h6 p# ` ) A( A3 C# I3 @
}
, Y; S& z" i) U2 \8 ]* a */& M- K$ Y1 j4 K, G/ X1 | K
//comment out all methods, N=100000 202s
8 a/ t5 W5 ]: C/ v; M }
* N1 X9 Z/ l8 D) j1 ^& Y5 J0 G7 s1 m6 ^5 v* u
delete []b1;
# ?6 f# n( r# j7 H' { delete []b2; 1 U' I2 V2 w: J4 C9 E4 y: S4 T2 J* O
|
|