TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 / S' p% ?8 O. ~5 Y' b' [- z+ \5 `( N
. ?8 C* i8 |7 n2 e" L, e& M* A理了理思路,重新做了一个测试。
, J+ F1 v0 D" o8 y) F做了两个 vector 和 两个 float *, 都长 100000# |2 }7 V$ c! G3 ?! M$ ~7 Z
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
; E7 Z# p q* B
8 y6 W" h6 b% u7 R内循环试了4种方法,
5 l- T; V; Y- z9 [9 A) B! N1. 直接调用 vector inner_product 247s , Z4 H7 ~6 N# h
2. vector 循环点乘累加 237s
/ }- S4 @* @$ U9 x3. float * 循环点乘累加 204s) {: l2 {" i! D
4. 空循环 100000 次 202s
. [# A5 ?+ M( B' {6 H2 B& y( f6 Q1 G/ K( d. K; A+ U3 _, ]
不做内循环 200s3 [& U$ V: ^4 h0 u4 Y0 ^- I, M
. c% }& x, e; H+ y$ l) e1 f9 D
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
# Q5 A, M0 B! v$ V& e5 p另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
, L. F. P$ f6 E* n/ E3 K% E8 i; X( k" F' F+ P- K3 N0 [
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)& _# H6 c- O# Y
' f0 Z+ O! a Z, P2 i) Y% ?/ j0 A
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)# n4 {1 p2 ]/ M, R
' T: [, {7 ]6 p3 `! ] std::vector < float > vec1(N);
) f: j; A( R; ~& y6 } std::vector < float > vec2(N);
+ ]/ B6 I' z3 V$ z: y float* b1 = new float[N];7 ` l, r0 L2 G
float* b2 = new float[N];3 H- B5 p; p2 o& x1 r4 u( J
9 f+ R9 g" U+ ]: T4 V for (int j = 0; j < 6000; j++)
0 K; ^% J. s8 T, W5 F {
) {+ s# X2 p. u% I! k) Z std::generate(vec1.begin(), vec1.end(), []() {6 C" c( g8 W4 F3 O) f
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;% t' R/ b: a$ g9 e
});
2 o4 z, C( k }: h5 w+ D) C* ]( P: q/ R U6 ^& Q0 n! K
std::generate(vec2.begin(), vec2.end(), []() {
' m5 G( i, A8 ~1 [2 B+ A8 }8 Z return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
& d/ L5 \3 x2 n9 h+ ? });
# U+ e5 P$ z2 l0 Q+ F: w
6 D/ Z6 a- Q, P; A2 e3 a for (size_t jj = 0; jj < vec1.size(); jj++)
; c# ~0 H) c3 v {4 e$ f4 D( @2 C0 e
b1[jj] = vec1[jj];5 G9 G+ E0 m0 F6 t, p. B2 x$ f2 |6 t
}
; w4 |* k' W* k2 x- H8 h. H. }. d1 O8 X2 I
for (size_t jj = 0; jj < vec2.size(); jj++)! W* k2 f' {! ?# r
{
; @/ h; l) `7 y& d" W1 x b2[jj] = vec2[jj];4 M" E" H% @+ M1 v5 K; V
}$ V6 c. `( n! J4 {0 N6 s
! s; l4 B" P4 S* r# i, e( \+ M
//Method - 1 N=100000 247s
+ ]4 S7 j. D2 i/ E1 d) B6 g' D+ f+ D //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);) j9 B P% p7 |9 E2 {
9 l9 ?7 x' X |: g0 g9 k. O //Method - 2 N=100000 237s/ h5 I- v# z2 _# W
/*
& P3 h- k `6 c i: _5 o for (int jj = 0; jj < N ; jj++)% j2 N( d b0 S4 {0 |) e
{0 G2 z" a* c% k
fresult += vec1[jj] * vec2[jj];$ \- ?/ `) `& A* Y
}: z* `( H( L" C, S! y% y
*/0 w! g5 V: m& m( ~+ Q8 t
* V) h4 g. J* q0 r/ Z( X //Method - 3 N=100000 204s
, P+ V8 N2 b( j/ i# ^6 b: Z /*, d6 u+ q! |5 W- H5 A# d
for (int jj = 0; jj < N; jj++)* E$ S" X ~( b
{
( _( Y3 C9 z/ i U+ S, ~/ o) | fresult += b1[jj] * b2[jj];
* Y# |& P# Y. R* }9 u }
+ M }7 m5 p2 C# b& s */
1 \3 J) V- ?1 f7 b& S4 z; Q2 e5 x
7 D+ t1 o' f0 \9 A //Method - 4 202s$ d' M( h$ p0 |( p
/*) Y( X8 c6 l3 ~1 B6 y
for (int jj = 0; jj < N; jj++)
$ R/ }6 ]" b, K6 f" Z5 U {- e9 b" K4 {. I9 |# J
% E6 K0 L7 C- {& S1 w* i! s# z/ s! h
}
4 ~! v- ~/ A' | */- }" L2 S" E. n: | [
//comment out all methods, N=100000 202s
# D1 L$ I/ K5 [1 r i4 ]: R$ I }! g' y) x, \( a" C' _' s
/ k% \8 y& G, g. o8 u0 e8 [
delete []b1;
' z* F$ e1 p% a delete []b2;
* ~6 A2 E% v& H% y, Z' x |
|