TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
9 Y, O/ V. f3 z6 a3 O/ u B
) O: l, J7 R# l8 f1 E理了理思路,重新做了一个测试。+ Q# l9 N# ]" G* o6 R; V
做了两个 vector 和 两个 float *, 都长 100000
. D! h# o8 T+ v* `; L外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.( T5 h0 J+ K, H( g, v
: h* O. g0 y: o) S0 R2 H( k+ U! ^8 N- Z内循环试了4种方法,# g0 ^5 H/ K# A
1. 直接调用 vector inner_product 247s ' P% K" q% y' f( W
2. vector 循环点乘累加 237s. g1 Y7 I n. I1 [6 }" A! @
3. float * 循环点乘累加 204s+ l" @( ~; }* R6 F8 m+ l& G" x* w0 Z
4. 空循环 100000 次 202s) Z) n3 F/ \' Z* v$ C1 d
1 _+ u7 f, q5 W$ o6 K* l2 ~7 g
不做内循环 200s
% J% L) C# g3 _8 @! n6 f% B3 H* J9 y# c& l( _
你昨天说的对,内循环本身占比是很小的,大头在其他处理。$ z, C; D$ f6 K$ g+ b9 N/ l/ S
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
- m. d" F& D) F: g% M+ G6 d0 w: C! w* A
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
3 \, G: B4 S. X( }! T$ x J$ i7 ^$ R; y1 k' F" A0 j
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)1 A i$ ~; ~1 k+ {' f
$ t* }4 J' X n$ V
std::vector < float > vec1(N);
3 u V2 Z! }- y9 K" c* y) ?) l std::vector < float > vec2(N);
/ P+ @6 ?, [/ W5 l5 ` float* b1 = new float[N];9 ?) U" L Y/ H" Q8 s8 H1 r
float* b2 = new float[N];
: \5 N6 s6 F* D
7 w( z6 i& n7 Z- W" J for (int j = 0; j < 6000; j++). j# v4 p! O/ ~+ v# t& p! d6 E
{
V3 U6 B% {, F) A8 C std::generate(vec1.begin(), vec1.end(), []() {
1 d! u' e# q! R: p+ H) ~ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
8 {! W. O7 b9 B0 O4 _& p });2 I4 x3 a: K o( w- }
" c$ P0 y# k9 u6 W std::generate(vec2.begin(), vec2.end(), []() {
+ F3 }- ?5 O$ x( G/ J! j return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;9 i/ y B0 ^4 l' p8 t l, m
}); @- M& d) e7 X4 s" v9 j& E
6 V, d6 x" W8 {* m$ T! c- Y for (size_t jj = 0; jj < vec1.size(); jj++)4 V, w* i, j) E/ s S' P: D* z
{
# ]) \" o' V; [5 i" v: k b1[jj] = vec1[jj];$ {- e! }0 u9 u& T7 G
}
! |9 `/ M; l: r; d+ [3 G' y C$ D M3 ]: e
for (size_t jj = 0; jj < vec2.size(); jj++)
# ]0 K: B6 A# v5 t0 e {9 l Z* H8 y, K+ `) ?; X! r
b2[jj] = vec2[jj];$ s6 Z) h. F6 R( w8 W- V2 a
}7 q a2 ]/ _$ a6 y! x
- ]' w& g) I+ ~9 R
//Method - 1 N=100000 247s
! I6 H2 F6 ^$ J! {+ M/ a# ~* ~# g //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
2 Z' v+ l, s4 ~7 P- K / | @3 a" b6 F
//Method - 2 N=100000 237s0 J0 A0 q6 i+ O" x C' J
/*5 p \5 R3 H" I% @ O- v- N2 [ @
for (int jj = 0; jj < N ; jj++)
4 r, Q( K* C6 ?8 _ {
6 ~' K/ f6 g. B f5 c4 v fresult += vec1[jj] * vec2[jj];
3 C5 g) |) V: A/ S8 r; V }
& Z/ W0 d9 ]8 X3 }/ d */0 }5 O' |; r0 v' y/ C9 o
2 c' e6 |7 k/ C+ X, B1 a" A
//Method - 3 N=100000 204s% |4 v. Q- O7 [* B" ~6 H8 u
/*; F" u! X1 s( i% C3 g" N7 u
for (int jj = 0; jj < N; jj++)$ @" P, u; j. [6 p. |% H, {
{
4 K0 G* ^$ |3 [+ Z! \9 b, z' W, k9 V fresult += b1[jj] * b2[jj];
0 p/ [' y% h# h: w9 S N }
) n1 q9 u; a% K, n */! M& J4 [6 `2 H" w) z! M0 m0 G% e
0 V6 W6 V2 }; n% S //Method - 4 202s
- q9 _' I' ~2 o1 l; L /*
; g# j! @0 ?1 w# O% Y/ ^/ U% {( k# \ for (int jj = 0; jj < N; jj++)
! z- `. J; V! l& L& m( J {5 g0 v8 T w+ o" p, q
! ~ e( o+ `6 P }
3 d# t! s$ O* U0 x& v9 V0 Q% ? */
9 ^# ]/ g, K. c' y( j) v3 | //comment out all methods, N=100000 202s
" \; L" m" C2 E0 c; R0 ~ }
9 U2 k! B1 |+ a1 P% ?, b% i; C3 h- W5 C: o0 r i+ a& m
delete []b1;
; X7 g4 ^% V0 [0 e' b delete []b2; - ?7 A* Q6 T0 R; Z6 y
|
|