TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
0 U7 h" ?/ @* f1 ?/ W B+ V
# U% }! x7 y1 y4 ~, T0 e7 }理了理思路,重新做了一个测试。
* c' P; q/ A2 K3 u做了两个 vector 和 两个 float *, 都长 100000
& {4 ?8 p* X! {1 T( y! Y外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.+ N; g5 z8 @( C
R( n* Q4 i/ x" w+ @* y3 b/ u2 E内循环试了4种方法,( f; Q/ l* n9 Q& @* p% F/ |
1. 直接调用 vector inner_product 247s ; j1 B# E) `& h; p$ M
2. vector 循环点乘累加 237s: N9 A: [4 r1 x0 U
3. float * 循环点乘累加 204s7 R5 b: ~7 Z/ v. i6 {
4. 空循环 100000 次 202s0 n- ~1 F0 C( O$ a, w: F
+ a4 q T# E# r0 o7 F
不做内循环 200s
) l& H2 q. E+ V* m9 n" z$ C# Z
/ y3 o# C$ n) f你昨天说的对,内循环本身占比是很小的,大头在其他处理。" f( P. H: i* z0 Y& l
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。, N9 D$ G2 D, l( u+ A+ {: Z
/ m" S# J7 f+ o至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
# J% y$ ~5 S+ K' P1 H0 V! |! m' T* {) J1 v
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)2 w/ O6 @! J* z9 W* D9 l8 w
; Q8 |& r$ D1 T
std::vector < float > vec1(N); h- V" |- {/ q' J% e+ t
std::vector < float > vec2(N);
$ Y, y: q/ r9 m5 B2 c! o3 s float* b1 = new float[N];2 S; e% |* Z4 x3 h- Q1 t5 S
float* b2 = new float[N];
q7 G% L: u7 W9 }9 u# y9 |( R8 Y6 G. T) K# L6 l& Q7 w: B
for (int j = 0; j < 6000; j++)
( F2 \! m6 N# e, v) h {+ T7 @; H% E+ n$ E9 V) R: P7 d
std::generate(vec1.begin(), vec1.end(), []() {8 ?# @) {& e7 ^1 J" O/ q; k `
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
. |# B9 }& B6 k' h! v });+ T7 j( W, f J# J" k
: c7 ]0 W: n" k
std::generate(vec2.begin(), vec2.end(), []() {% j d X/ d8 e% |
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
$ O6 i7 f& {0 ` });$ i2 Z( ~& @) y+ Y! g/ O0 m
, L! M) ~+ R7 C7 \, E
for (size_t jj = 0; jj < vec1.size(); jj++)
9 t7 h. {- a5 K9 K0 p/ `. ^+ O# }' Y {
9 N3 I! `7 s; l; [% m$ C; N! J b1[jj] = vec1[jj];8 s+ W( `5 K* Y2 P9 H+ \
}: Q; i# T. X) @7 F. g7 b
3 K) j5 P- E8 T, a, U for (size_t jj = 0; jj < vec2.size(); jj++)6 t& I- @" | g8 C! x
{
6 K3 B) R7 w7 z b2[jj] = vec2[jj];2 b7 o* I" `9 i! v
}
5 g$ p; G& f; H; A0 ] h; }& A" I7 N
0 Y6 \+ t2 Q1 Q' ^7 b //Method - 1 N=100000 247s
5 i7 a" b& [9 J; G8 x. B- Y //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);- r. x$ T" J0 ~, P( @
' W+ Z, R( p9 M$ i: M U( ?; A //Method - 2 N=100000 237s
; N* q5 f1 L9 R /*
+ i: d) i+ J% ~' k; i, w& V for (int jj = 0; jj < N ; jj++)
9 h& z1 p2 j5 J' X5 s7 H* V1 R( x3 G {
5 f2 a v0 ]$ a) v6 e fresult += vec1[jj] * vec2[jj];
; {# b" u- ~( `+ t8 T6 ] }' V0 G5 y( h$ o/ F
*/0 T; ~; v7 Y. t5 ^
2 n: s% T' K; a
//Method - 3 N=100000 204s
) `8 r6 k% l+ c$ ?* r /*
) b+ \4 a0 r6 m: k: f$ U% Y for (int jj = 0; jj < N; jj++)
! ^6 H% d1 o# p; V5 r {
2 ]$ Z7 U* @0 b- p* [ fresult += b1[jj] * b2[jj];
, B6 ^# O- ] O* s% X7 V }
9 q- v4 O4 V- Q: {, Q */
# [2 u' g* F7 i2 C, a. N% l- A& E/ g
//Method - 4 202s! H( m p% j' R4 c0 M; R" n. [8 Q
/*3 |, A( g* }7 @* K) L3 P2 E' k7 J
for (int jj = 0; jj < N; jj++)
8 z+ H( X3 V; l4 v. @. D7 l {
4 B+ i- g" _8 O% P" k( a* ~; b
; `7 }! {. A6 z6 p( F* A. c8 k }
. F, F) j0 ~1 P% k# w8 ^% U */
4 m( Y: B* S. q' X) [$ L //comment out all methods, N=100000 202s . d& N+ \2 Q; e" V# s/ l- Z0 ?0 B
}
& C6 {+ s; B8 A. Z6 j; w) |. i( P8 s0 v3 {( I& z
delete []b1;& Y" F. J7 f W, g- X* I! L
delete []b2;
/ h J8 ]) q/ T- o) c! H" N7 T |
|