TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
0 {, X' \' _, {! |
, u, M. K1 R* F: t3 i @理了理思路,重新做了一个测试。
' B5 g5 w- b# n8 g1 k) Z" h9 t做了两个 vector 和 两个 float *, 都长 100000
# B( L+ _5 O" N2 e/ k外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache., k, r8 k0 _1 z6 y6 V: t
6 o" n% {1 z- C7 U
内循环试了4种方法,
5 k2 S. t; \$ N& `( c/ }0 Q7 e' f1. 直接调用 vector inner_product 247s
9 }$ B# x' ]; P: E2. vector 循环点乘累加 237s
- {7 r+ }% n4 y% @8 d5 G3. float * 循环点乘累加 204s: n$ ?6 X( L7 i4 U- \
4. 空循环 100000 次 202s
$ H8 T% ^7 m# a8 m9 e8 Q7 }' m/ s2 M6 Y& {- x4 a1 |$ s
不做内循环 200s
9 E' X4 q/ C4 h1 Q0 G9 X
, @) o- X7 n, s你昨天说的对,内循环本身占比是很小的,大头在其他处理。
: \ `% s" e- ~; G# T8 f9 G; E另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
& Q) {6 V! O/ b8 L3 K0 N+ W+ X, @3 k, y; l2 ~% r
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)& `6 L% T4 \/ N$ _ Z
% f0 |+ V+ S# E! w* P: M* \
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
) n2 z6 c( R& g8 L( \
7 a% f4 b" u/ T5 N' o+ A' W( i std::vector < float > vec1(N);
! \6 n+ d& g8 j& N1 j8 r$ [ std::vector < float > vec2(N);6 H9 y' A" R1 U$ J$ }0 R
float* b1 = new float[N];( z$ T2 H9 r {8 f6 M: M; B$ V
float* b2 = new float[N];3 }/ x- ]# k% s" K# I: r
- F% j1 D" e, ~" H% u8 m' N4 s for (int j = 0; j < 6000; j++)8 {4 M+ v0 }1 u% {) e
{
: Y6 z. {2 [, q8 u std::generate(vec1.begin(), vec1.end(), []() {
) U; Z; K' q- s% C* C- P* l return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
4 z2 z8 J* P# q6 {) N });
- z6 z6 [8 m$ I2 `$ j# s$ b& o. v4 N# ~% E+ C3 @% J- c' m
std::generate(vec2.begin(), vec2.end(), []() {
/ {: z7 w& U4 \+ `0 k" I3 ` return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
# y/ g# Q6 i# J: k6 m8 c" ]4 L });
& [9 k1 V( W+ v& Q# K4 h# x$ j- ~- X, x% O7 m& v2 `: @& |! p0 g
for (size_t jj = 0; jj < vec1.size(); jj++)1 l4 y* U4 X1 x* h1 z( C
{& K$ L* z7 f. I- q
b1[jj] = vec1[jj];
/ M$ }3 J7 Z+ K. t- e8 ] }
) r, `/ V4 |6 y" j$ Z2 p1 O) v. x0 c% Y( Z9 ~3 ^6 n) w ?5 V1 P7 W
for (size_t jj = 0; jj < vec2.size(); jj++)8 B9 `5 J- b2 U0 ?1 e& K# k
{ @; e5 a. t2 Y2 Q% o0 v) F
b2[jj] = vec2[jj];( c2 | _" m7 M* Z
}. T8 z- `4 N# W- s/ i) A
: E: k; \0 _8 T; @, i5 z
//Method - 1 N=100000 247s 5 a$ X* `% J6 E* T2 T3 R. N$ q i
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
4 F D( F: ~! c $ N5 [0 m5 Z* W0 H( U0 |( o3 {; N" ?9 [
//Method - 2 N=100000 237s8 ^+ I0 j& }/ X. J
/* |& Z3 J& U( U/ O! E
for (int jj = 0; jj < N ; jj++)
" T+ C6 V/ i3 }; c8 @ {
; Z2 f# f$ k d5 J fresult += vec1[jj] * vec2[jj];
! w Q7 _. T3 E }1 }( q2 m) J5 t) u. j
*/
! w# B7 o0 [6 f" u1 Y
6 |" c9 b: A: q //Method - 3 N=100000 204s, |2 `: |& D7 r4 f; H8 z* {( y- U
/*
5 d) |5 _0 U7 z for (int jj = 0; jj < N; jj++)/ M H7 _+ v. e6 s) h5 M
{; u6 y& T; m i( ~
fresult += b1[jj] * b2[jj];
3 q+ @ e* L. L" b$ I9 f4 P j' a }
' V7 V' i7 V+ h3 t2 N */1 j* M* U" n( O- C* H u
3 z+ ^ j# S& r/ R5 t5 @
//Method - 4 202s
0 R0 Q* h+ g: m* r; Y" a" V /** K: @% R2 g$ I. f! C8 Z
for (int jj = 0; jj < N; jj++)5 H% D! C X# l; H+ e& l y
{7 V2 ~% e( w5 F7 R5 l! M
# q* u5 A- Q% P5 P: S0 W) L
}
# M" F$ m1 j& j( H) `+ O8 n( ~ */1 n, g2 M ^: _3 X9 X
//comment out all methods, N=100000 202s
: }3 L% D8 ]( t$ [% ]1 Q' M" E }% E$ |, o) I9 q+ v
6 w1 q& o7 O0 x1 j# a delete []b1;% ?! H5 T; b( m9 n1 ~! y, C
delete []b2; ! F8 p: f1 m( J4 M% X
|
|