TA的每日心情 | 怒 2025-9-22 22:19 |
---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ( H4 O1 E# n- g6 W8 K9 B9 v* @
: d. {# X9 K, c" }: Y% ^
理了理思路,重新做了一个测试。2 |: A3 d. D% \- z
做了两个 vector 和 两个 float *, 都长 100000
7 x9 v8 o) z( a: H外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.! z6 H: f- S4 f1 N
; V$ s2 }) @: W' x
内循环试了4种方法,. P4 n1 k, G6 Y; p, d# ~
1. 直接调用 vector inner_product 247s " x3 w. [; B5 }
2. vector 循环点乘累加 237s
5 c$ V3 W6 O2 g F& X+ M/ k3. float * 循环点乘累加 204s1 F- L" `6 p% ^* C* F; k0 o
4. 空循环 100000 次 202s
+ T' m* n. |4 L. X f/ _4 F/ r! w7 X
不做内循环 200s
1 p5 {4 |2 z2 Y
5 j8 I8 |7 v% A你昨天说的对,内循环本身占比是很小的,大头在其他处理。% z9 K( W( ]7 {7 c% b4 e
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
) n3 q r9 v3 W
5 ?) a F( f9 x, |- x: R5 _+ d至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)' p" N; a% E8 @% |3 f" f
7 X# k& m \3 h( {3 S. z- f& t5 n B; C
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)1 v- ~8 R6 B8 k1 O& H! T
) }6 v0 e: r5 N5 M( m! V5 F std::vector < float > vec1(N);, f6 K6 y$ U, x( Y: m; C; j1 a
std::vector < float > vec2(N);" x% ]1 U0 r; T6 G
float* b1 = new float[N];
, j' |+ B: M) O float* b2 = new float[N];
* Y {. Z" _* |3 f4 x$ U% c0 K3 a+ Y- t; {
for (int j = 0; j < 6000; j++)5 \5 D D8 q. N7 }3 D! J( a; o% T$ G
{
% ?2 S% {# J; j/ C0 w/ N$ N std::generate(vec1.begin(), vec1.end(), []() {' [ L5 s* d2 }! W
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
! h- a& W' W! Z: R });
- Q) X2 n2 X7 j$ }2 p' ] l; u! `! F+ u
8 e# @$ o8 Q" J, h std::generate(vec2.begin(), vec2.end(), []() {3 p/ k2 x; T6 j) y" J5 M" V
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;; V5 q, C. o7 E; k- U
});& g% H2 O) V) ^& d: C" I4 n
) X6 o8 C U- h: b; g. b& G for (size_t jj = 0; jj < vec1.size(); jj++)+ g3 a9 k/ U# B! W
{
7 `) a- t2 ~; j+ T b1[jj] = vec1[jj];: m2 k6 v) A ]% V; H
}; u5 Y Z1 v! a* ]1 Y
0 ^: A; g" x& p$ [6 K for (size_t jj = 0; jj < vec2.size(); jj++)
_* ^) U7 O9 R' n! v# y1 ^ {
# O2 s! f1 {" N9 \; ` b2[jj] = vec2[jj];0 f$ y8 ~: w) F8 F, u! S( r
}
% j0 v. Q9 Q% T H- ?
( D- B" b. w! [8 q6 X2 x //Method - 1 N=100000 247s
8 l S' m8 |3 ~# F( E //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
; D) D4 [# W/ H8 w& d/ u0 [% F- ~ + _ \+ M# v7 _" R0 _& P4 j
//Method - 2 N=100000 237s
! K0 i) U/ v8 C R /*( z# b2 ?: |! ~9 |) B% _5 [, b0 Q5 C
for (int jj = 0; jj < N ; jj++)) ^, v! C9 [ K( l
{5 s: ?3 Z# ] _" Z2 `: _ X
fresult += vec1[jj] * vec2[jj];
! s$ r0 R t: f4 n+ k0 Q3 U0 u, Q }) f7 h3 S9 s9 l Q: V! v" C
*/
$ N8 x- M' p+ g9 h
* y. d) T7 h+ w. ] //Method - 3 N=100000 204s
* M+ m& w$ l- R3 k' G /*5 k. l5 U6 C( Z3 Q6 O
for (int jj = 0; jj < N; jj++)
; V& ?6 m) h" y" y {
0 j# K N. @ N% E) [+ Y/ ` fresult += b1[jj] * b2[jj];
1 ^' S k i! k% @) B I7 q }% T8 v, j" b6 ?3 v7 i' r
*/# w6 J& G$ ^" O7 o3 M1 _
' ~1 F7 G: E+ H9 ?( U8 Q! u, b //Method - 4 202s f! T2 v" y/ h, ~% a: H" R c8 h; D
/*
" Q) k2 r' ?* j* B7 h; v3 U for (int jj = 0; jj < N; jj++)) Q2 i2 e6 L7 u+ R, j; B0 x% S
{
: G1 H6 ~5 O Z+ Y* }1 b$ i
) j* P4 j: ~9 G* X- m }
/ A2 u" D5 _7 b7 s _3 B" r */% q/ }4 s* c- M5 N9 e# k
//comment out all methods, N=100000 202s
3 P {+ q% T; W4 @/ K+ b }2 |, E* }3 m0 r6 i4 T. O: r7 T
?: B( [ D) ~4 u9 W3 p( c" S delete []b1;
+ |/ X, ]% ~4 ~ f delete []b2; : [9 O9 S: M; y# V0 i
|
|