TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
/ C# u5 Q- d3 {1 G% K3 k! a( f+ L) s. I$ H$ I; X( \
理了理思路,重新做了一个测试。
+ e# E3 W/ }+ b" b做了两个 vector 和 两个 float *, 都长 100000
$ r2 M3 Z: x T7 [6 B- }) T外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
4 R* T+ X9 e9 [" _. |
% S7 |9 Y* ]# z; F( X内循环试了4种方法,* M- u4 E: g9 g5 Q' D k/ y) H
1. 直接调用 vector inner_product 247s 5 I3 M7 N; _. X/ n, f
2. vector 循环点乘累加 237s
[3 i% `7 G$ b" Y! u2 L3. float * 循环点乘累加 204s
: |! x5 M+ |4 B4 N0 K8 ?2 T4. 空循环 100000 次 202s' h+ [; f$ i E1 P/ ]
5 T2 o6 A2 b0 i1 _
不做内循环 200s
# {7 f" g% Z8 n l$ I/ r9 b! |6 U" I, j: m9 O
你昨天说的对,内循环本身占比是很小的,大头在其他处理。6 R7 o1 Y8 H+ n8 S+ w
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。" _ A" c/ b" w
& w4 W) O# p( A$ n }' p- \至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
* h4 O. `6 r$ \( \ u% R* y% e8 c* N8 z
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)4 X4 f$ E9 ]- M9 @! n/ ?
3 T# Q2 X. v$ ^4 E" n0 W | std::vector < float > vec1(N);! R% ~/ r# Q3 \" Q( d
std::vector < float > vec2(N);
: q8 k) m. L% Y ^1 Q float* b1 = new float[N];: w3 G) e6 G; r3 x8 u7 d
float* b2 = new float[N];
$ p- i8 g6 j2 U# A
. h) Z% o8 Y6 t; ^% x for (int j = 0; j < 6000; j++)
( W6 o% g9 C. q: F! r {) b5 Q+ @. |, `/ x- R- K( s
std::generate(vec1.begin(), vec1.end(), []() {
1 K% _$ D5 d/ h, T! c return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
( J7 i6 K+ n; _0 W# r0 c });, m- l0 H! v+ |3 m. n5 u% F# k
: `* q* S( }6 r9 y) J& u( A+ m! w std::generate(vec2.begin(), vec2.end(), []() {
6 u3 Y5 Q& m/ G7 ?* ^1 A7 | f6 h- Q return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;0 {; i r# X1 W$ y2 w4 W
});
5 F7 p0 E2 r, U# E3 V; u$ L
* F# F0 m9 |* p3 O7 \7 z, W for (size_t jj = 0; jj < vec1.size(); jj++)
0 _: @& F4 N. L% [! { {
7 O6 I$ d- v# V! x+ l9 |5 O' h b1[jj] = vec1[jj];$ z# {! z2 Q+ C
}
" Q# {6 ?8 M: O3 r5 `; K i) _/ B, g6 y4 q% }: T, u
for (size_t jj = 0; jj < vec2.size(); jj++)& ^+ E7 K8 I2 U4 T. T2 a
{$ X7 s5 p! X* C
b2[jj] = vec2[jj];
# O# Q. h7 A4 v9 \: ~ }
. S) e& @2 d/ d! k- |' l
; a& }0 n d! `: f% C //Method - 1 N=100000 247s # ^8 m' V1 N# G
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);5 u1 q; J# w5 J4 X
) U3 y8 \# G& u1 L
//Method - 2 N=100000 237s
- B1 a' {; p: z* H* }$ q5 e3 W /*
& m2 Q! I5 S7 s/ F( Y( Z for (int jj = 0; jj < N ; jj++)! p* s6 s; p0 D# A+ E- w+ U& o
{
: E& @7 b( d' O# D( {5 c, l1 y fresult += vec1[jj] * vec2[jj];
2 s5 b6 E) t2 P2 w' W/ M }
" h2 ^9 @7 D1 h4 b */
0 E+ _; H ?/ ^* }9 r 2 f: R0 L1 Z7 Y+ h9 i8 \
//Method - 3 N=100000 204s
0 ^- y9 h# G7 R! T /*
! R" B* M) e; K7 W for (int jj = 0; jj < N; jj++)1 ^% F% @1 s3 `, s
{
8 x* _. N* r% @ i& l- v fresult += b1[jj] * b2[jj];
) {! P, U# W( t( }3 \' l& A+ B }
2 D% o, a, N+ Y! Q) c */
8 v g" \+ s" S& i- V# R
, }' C" n! C, K- Q! y //Method - 4 202s
+ A( Q0 q" E. M0 A /*) H$ d8 ?6 c8 R1 i, _5 h7 I8 ^/ c3 P
for (int jj = 0; jj < N; jj++)
2 H5 ]1 d7 R: M4 K9 s0 g {
* ^% K; I: t5 m0 A4 D$ g9 Y - \2 _ I9 h5 Y$ B2 M/ t
}' g9 _# Q1 i$ J9 f
*/2 U5 A. Z% C/ d! P, h% ?+ c
//comment out all methods, N=100000 202s 8 X) }/ c n+ f& f, `! F& i
}! `6 }. }. z- {' ?: i& t" k
" W' J. ~$ L, p& |* I2 C1 {
delete []b1;4 Y5 J2 ]' p- U5 ]+ x) h, w
delete []b2;
- Z& C w, j( U+ \' V( a |
|