设为首页收藏本站

爱吱声

 找回密码
 注册
搜索
查看: 6827|回复: 25
打印 上一主题 下一主题

[信息技术] C++ 提速的新发现

[复制链接]
  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?6 {/ e" n% t7 J2 W" i$ |/ x, b

    6 C7 I2 }3 i8 |自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。8 n' p) F2 D4 J9 O; P$ D/ S

    + ^! ~* q1 p6 f8 e速度优化问题真的很有意思啊。
    % K( J$ h, u' p( L+ J2 e: f* o
    9 @3 e! r" W. z" P欢迎大家继续讨论

    评分

    参与人数 2爱元 +8 收起 理由
    helloworld + 4
    住在乡下 + 4 涨姿势

    查看全部评分

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    & C  ^7 ?7 p* {  M# W把代码贴上来看看?
    & z! W: B, w# L) I* [7 [7 Z% L5 H9 Y2 G9 ^7 @0 A4 L
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 2022-9-24 23:15:41 | 只看该作者
    会不会代码本身的缺陷阻止了自动优化?另外,硬件配置和开发环境可能也有关系。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-6-14 10:13
  • 签到天数: 124 天

    [LV.7]分神

    地板
    发表于 2022-9-24 23:33:02 | 只看该作者
    Maybe Debug mode?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑 3 j3 s0 y3 Z5 S* p8 g& i, T
    数值分析 发表于 2022-9-24 23:044 l% Z& z3 d: Z' m0 ~, k: d- u
    拉下来?拉多少?
    3 R. o) \6 B# c: F6 E6 z0 a$ _把代码贴上来看看?

    1 {3 C! R" O- u/ K% t0 p/ z! {0 k1 U+ ?" G" o* y6 j! N
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)3 a6 H  j. ~- D' G1 m6 }( C( j
    {% {( _' X5 l1 j- x  J
            comp temp, xtimesy;
    , _& ?; n/ A) q8 a: |- p1 v" N        xtimesy.re = 0;0 U8 Z2 X) v' ?- @
            xtimesy.im = 0;
    ) x1 p2 u; t& O% q3 M8 z( X        int j0 = lenB - 1;$ e3 a- \* }- n9 B2 H
            int    i, j, i1, reali;
    2 w, Q; s! u5 J! o! ~        if (lenA % 2 == 1)
    7 u" T" W4 L# y1 h                reali = lenA + 1;# {0 t# n* W' \8 R( [- S. B& N7 k6 @
            else
    ! r  z8 L* K7 \( A8 N: I+ z. p                reali = lenA;: O6 ]3 Q: u% a/ h7 q0 A( j" O5 v
            reali /= 2;
    6 E) g7 x- ^: o4 N2 Y* a
    : O9 d: j# N" |0 g2 \        int nconv = reali + lenB;! _$ y# ~' _* X% l
            //#pragma omp parallel for8 _( q: I# M4 P3 \; K! _3 C% E
            for (i = reali; i < nconv; i++)
    0 i3 i: }) `, t, b& a7 |        {/ q. _& k) E( \; y
                    temp.re = 0;
    6 f( R$ ~; a+ r7 n# c. r9 o                temp.im = 0;
    5 Y' M: l5 F5 Z' h                i1 = i;
    7 J( Z+ y6 H9 T( o" n# g5 x                for (j = j0; j >= 0; j--)' a! i; n# e+ R6 N- [
                    {1 ?+ X( o" o' g# b. p1 m( v! t
                            /* floating date operation */% `- {  |# A- `. R3 ~
                    }
    ! ?/ i) D: ~/ f. F- J& [
            }, L( H8 i- L9 @7 j1 v& Y
    }
    $ j8 G7 d% v0 U+ G6 B! W, y  D# \) q( G6 m( `
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样- {7 {% z3 u4 R# y+ ?; z

    " F8 R8 A% g0 [& V9 p红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。0 f6 s& M, P% w+ a! A
    现在call xcorr 100次,耗时78s.
    / G3 }, ]9 L4 @* k" @' V1 A2 k6 `7 ?0 l0 z1 }3 [+ s2 B" j( j5 ^
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. & z( G/ N. W- A* h( _2 _

    ' X% B8 Z$ q6 |) `. B% z
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33  ^% M2 e5 |0 T" ]. K
    Maybe Debug mode?
    7 X! j" G4 i6 [* S) n& {
    9 F7 s5 K! E  P6 Z- @) S
    不应该,看我上面的回复。6 z/ l* Y' i9 ~) v% ~5 ]  t
    , P) C% `, L+ j4 f6 |
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 % T' y" D3 a9 e0 i$ J' ~) {* h. |
    雷达 发表于 2022-9-24 23:547 N6 K! R$ d- T4 |
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB); b. ^% x. L7 n) }& |
    {
    / X' X& R1 y! y' y! i        comp temp, xtimesy;

    & p- d6 j4 {# E. [
    ( v0 N' ]7 U; l' E  `+ w  o" i这个不是这么比的吧。。。' P) i" N3 c; |* i9 b8 B* V; X; N

    % I. V1 p# J& K' s您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ! b! q- J7 [' [8 _$ V( o: G
    1 T& w  D5 O" l: ?7 X而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 " D! Y: C( Y) v" [! s; u
    数值分析 发表于 2022-9-25 00:20/ g+ f9 Z, Q6 F& A- F) h
    这个不是这么比的吧。。。
    - G4 R% c" H0 @- H" h& t7 C: u- h4 K/ C% `
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    ; F% S0 k8 ^% w4 k
    - x9 l9 T3 E* O4 r有道理。
    ; A1 z+ |& e$ @9 v1 H所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    7 a" Z  A. `* G" c0 ?/ u- J, L. J$ u, E5 O8 h
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:468 T- B7 W9 p1 h1 I" W$ N+ p: U
    有道理。
    0 E6 O- h1 g, [所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    1 M% E; m, M* B
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多- X, r6 U# f4 n* g
    Why is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
    " i+ D+ ~: Z+ |4 T这个不是这么比的吧。。。
    3 H# l( N1 v7 g7 d' w1 `  w; D/ e$ U/ ]+ |0 q: }& _) ]" f% U7 i
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    - _( g4 ~& y# k! f8 G  F

    9 @$ H8 r1 x6 ?5 b% R现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    % Z' ~# L$ [' `
    沉宝 发表于 2022-9-25 01:48
    * u3 z$ M4 p# m现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    5 x" v: J7 ~( ]) J4 C  z& w% X% a* J) f; ?# K) {
    是的,兄台说的对。
    * B/ y! v8 o0 r* Q8 m& F( B, F0 B7 [+ g
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    ! a* Q7 t: ~, U
    6 H2 _' B) Q( x0 t9 X- a, K雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    5 X: j0 b4 I8 V* B. x: i6 J  {* V; A
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    2 n9 \9 M9 n" w( w; n/ t) T0 t, E- I, k' G" _. x! I
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 ! e' H0 H# x% _- [5 B; A5 F9 \
    沉宝 发表于 2022-9-25 01:27# Y$ l- m" y& V6 T0 L
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    $ I( W& }) s5 [& J% V9 I: s+ \/ ]8 V9 }  p5 T
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    ) h( o4 [( d3 Y5 b+ S# T. y# S) m8 f! X5 K. i# |+ K
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:479 `$ `5 {* ~9 N- d% d; {4 Q
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    0 X: K% E& P+ r: y时间差一倍的结果可以接受。7 Y; S% |4 k+ D+ j) p7 q) z. {

    * Y% y5 l+ u& q你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 , w% a3 ?: Y  P) X
    雷达 发表于 2022-9-25 04:47
    3 J: s5 z0 g/ G+ U( g) u. _又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ) @+ R- \# i# e  x& o: D- U) M3 |

      g1 Q( F8 D8 h2 M+ l0 k# [4 r3 N' G% \! f* a  q

    * I* s, l$ z0 @) t  _& c能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 ( y3 D, n- W7 v2 e7 d
    数值分析 发表于 2022-9-25 14:58! A* G0 e- l( H/ Y& e
    能不能把这个也贴上来,看看和上一个有什么不同?
    ) M' y. W+ l. C
    理了理思路,重新做了一个测试。
    ! U( S9 q7 o9 }做了两个 vector 和 两个 float *, 都长 100000
    4 V- j3 \9 o, K9 h外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache., t. n  |6 O. v8 l- {- D
    + o/ }) z9 c3 M
    内循环试了4种方法,
    ( a- g1 J- r' \2 N1. 直接调用 vector inner_product 247s
    0 L1 e  l+ B# T2. vector 循环点乘累加 237s$ s: g9 b% @7 b8 p9 ^
    3. float * 循环点乘累加 204s3 C6 k# t: c$ l% d# R/ ~7 Y1 x( i9 z
    4. 空循环 100000 次 202s
    + F7 }% r  q5 F& v# Z
    4 [! e# l% `. K2 b7 Z/ v& P" W/ W不做内循环 200s
    9 W1 Z$ K1 P% N2 q7 j3 N" Q8 h. M: R" n$ @- T! e
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    2 u6 |# O" V' V3 G; o; D$ V+ @& P另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。3 O% C& Q& C$ r

    0 s5 q' z6 ?. ]  K0 M至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)  X3 _8 V, Q. P8 t  n8 o

    : k* m+ C7 g7 G  a(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)0 ]" J; o  p4 X' z  I3 F, q4 r
    & ^6 K) b* M" i7 M6 U9 q
            std::vector < float > vec1(N);
    0 K' _$ g! z0 X9 i4 y! J        std::vector < float > vec2(N);
    : l. a) n4 ]1 L  F8 L8 ^        float* b1 = new float[N];. i5 R4 v, x7 e, A+ y  I- e$ O6 A
            float* b2 = new float[N];7 Z  \# W+ u: |( e4 _! Z1 R

    " D! x+ f+ P$ ^+ c8 b6 H; j        for (int j = 0; j < 6000; j++)( W; Z" ]4 b5 L& C5 t
            {
    ! S: x" J  l6 V  Z                std::generate(vec1.begin(), vec1.end(), []() {3 Q/ g# j, e4 a
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    0 Y: e# J- h7 r                        });0 a& \1 ?; x( O
    : M6 q% g4 O0 \8 X1 v
                    std::generate(vec2.begin(), vec2.end(), []() {9 `5 G1 T# j+ [6 F7 [* U
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;# K4 |& u2 q7 w# S7 d- o" q8 [! I
                            });% W3 T/ Y; o, \, |

    + a8 h* ?1 r; K5 P3 U- `                for (size_t jj = 0; jj < vec1.size(); jj++)
    9 `2 y$ b+ |( l                {% m5 B5 h9 M* r! P
                            b1[jj] = vec1[jj];% k" |' B$ G  J  Y" T
                    }
    7 K2 J( d$ V4 o; s
    5 p3 _# M& R, W% f. |, T8 U& r- M                for (size_t jj = 0; jj < vec2.size(); jj++)
    ; c* E+ ?+ A/ V. K% T( M- i                {
    ! A& |+ q" Y- Q2 A                        b2[jj] = vec2[jj];
    & C7 r: k, Z2 K1 n( J8 V                }9 k, c8 y9 b9 Z; Z

    % @1 p' [+ P" `; L9 H) ?( c0 p( s                //Method - 1  N=100000 247s  " I( T1 y8 _! n" S1 X" a8 [0 e
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    ( {0 C( o( u/ U2 [6 g                                ; j  e0 i; I; C) v& F
                    //Method - 2  N=100000  237s4 h2 }" c/ E5 x
                    /*5 \" K+ g. t8 E
                    for (int jj = 0; jj < N ; jj++)
    $ T6 P& @0 e' L5 Q  q/ n                {: \7 I; O9 s  |3 h9 x& D) k3 W
                            fresult += vec1[jj] * vec2[jj];4 r3 k; k3 k' s4 O0 q
                    }
    $ H% I1 j! z; f6 y9 A                *// Q0 n$ i: S# z' f9 N
                                    
    ' z0 N- [4 e* i# w2 v                //Method - 3  N=100000 204s% j3 p! K: x  q* n, a" l, X( e. Z
                    /*
    ( H2 O  p+ C* o* A                for (int jj = 0; jj < N; jj++)
    * W. `1 y% j6 F0 o                {/ d( G1 ^' h% |, d4 ?3 n" }
                            fresult += b1[jj] * b2[jj];
    % w. V! K7 d; h8 D7 P5 ^% p$ f" ~( ?                }
    " [, c- A  Y# w- J5 {! ?                */
    0 P' y& n: c" E$ I/ l6 {  p6 K
    3 C- V$ {* Z  ^) m" p1 t                //Method - 4   202s
    ( o* {/ O/ c) ?9 V6 W                /*
    2 D  S- R$ q  I% O0 o4 ~                for (int jj = 0; jj < N; jj++), v1 \( [# Q6 ^6 a  p
                    {
    . s' D* o5 u5 S3 S$ F9 z                        
    / K6 Z, _) j; y. P  m# ?                }+ ~9 d; e; K. Z* H8 z# l" c
                    */1 o8 H) o& F9 K
                    //comment out all methods, N=100000  202s               
    ! X1 s  M. t5 A, ]        }
      H- V) n4 T7 M' H) C7 G1 o# |" I- u3 v. z8 k$ X0 |( _
            delete []b1;
      c" u" o' x8 o( K$ P        delete []b2;
    # k' b9 G: \: _* p* A5 c& J* i
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-2-8 10:08
  • 签到天数: 2 天

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?' O( v; z- M7 N$ l+ |3 O

    ( @' B0 X9 S4 F- W1 m+ _你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    / c. U5 ?0 M3 e6 r
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15. V# A3 B* v% J1 \, r8 M
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?7 r( ?/ U; h* O3 y* L3 ?7 K; w. s& a

    3 D7 `- j6 l4 d7 d你第二个试验里面的j在循环里面又重新定义 ...
    - p6 L5 d, s0 Q
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL6 n2 U! f% p8 l! M$ c

    + D0 q# {6 p8 U5 j4 A不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-2-8 10:08
  • 签到天数: 2 天

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    ! c4 {/ @$ m9 t3 t( c: X内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    & e7 n* ^( K6 s# N7 ~& O! l/ _9 b9 t0 c: ?2 A" g9 x' W
    不和它 ...

    1 m% i) r+ Y) P) v* ^3 r7 N
    ' H1 @+ f4 V: r8 K* E; t( G不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    1 L  j$ I! l% ]' I后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    19#
    发表于 2022-9-27 07:25:57 | 只看该作者
    一个无关问题,为什么爱坛的帖子里在我这里有好些奇怪的东东在里面,是防拷贝措施吗?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    ( N, _. Z, R9 B2 T- r5 `! nvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)2 x5 q: n; x3 Y+ Z; Q+ r: T
    {
    0 a5 _0 N! {0 a  {0 \        comp temp, xtimesy;
    # {& `0 T- S* `5 m0 R+ d
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    / T5 e: ~" f$ M$ d+ F6 ~内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?+ [( n& k+ @* y- z
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

    手机版|小黑屋|Archiver|网站错误报告|爱吱声   

    GMT+8, 2026-1-10 02:12 , Processed in 0.037848 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表