设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    ) Y: t2 X: D& D7 t, y" V6 o+ u& C$ a/ p0 R+ e7 _/ m
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    6 t3 K0 e; o" i/ G* T
    2 B$ {6 g3 P" E; E7 u速度优化问题真的很有意思啊。: k7 {/ z" Y7 }2 e- d: u

    # X! R) t; }, D% g- C欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情

    2025-7-28 23:17
  • 签到天数: 1935 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    : a5 \9 e( q" {7 @) ?- b0 S$ z; K& r把代码贴上来看看?0 F+ X; e) L4 R( f- O
    & b7 ]( Y' ^' H" l4 G/ h" i+ K
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑 6 N4 W# [7 u  u) `
    数值分析 发表于 2022-9-24 23:04* g' f! e2 x" E2 ]3 G% H" r. F
    拉下来?拉多少?6 _7 E0 N# S. D1 K) y0 L
    把代码贴上来看看?

    + i2 P. ]- J( U
    , k( _" G6 F! xvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)1 k2 C$ \9 Z+ `1 ?5 `
    {
    0 J1 n: `% z- T3 V, v        comp temp, xtimesy;
    0 j: m% g* m1 F% K" \2 o7 f        xtimesy.re = 0;# X7 L/ G6 L* k( l7 C
            xtimesy.im = 0;( o$ r7 ^2 i: x$ R
            int j0 = lenB - 1;, |6 E0 f0 x4 c( a: f4 t1 S' Z: q
            int    i, j, i1, reali;
    5 Z$ N, `, H- m1 v9 Z5 D5 }        if (lenA % 2 == 1)/ }2 c+ j- X4 s& ]* T4 d7 ]6 q
                    reali = lenA + 1;! ^0 M$ U' R% Q" Q
            else$ C( w: \3 u% e; w* R
                    reali = lenA;
    * m9 P7 o* x- u3 |4 m% z        reali /= 2;
    # i# n% z) M* J+ X) h2 G  M! c$ X4 ]# U, h
            int nconv = reali + lenB;
    ( R: O) Q* _) j# f        //#pragma omp parallel for
    # X2 c8 G' e, ?9 {! ~& l& q        for (i = reali; i < nconv; i++): D/ k- U: n" R3 n  W3 x
            {
    ' y# U6 ~0 \2 T                temp.re = 0;
    9 w7 ^  e9 |  R" I6 X5 s7 s                temp.im = 0;
    * p% O# p( p1 ]6 m0 n1 _                i1 = i;+ @2 F3 @+ v# T# f8 H
                    for (j = j0; j >= 0; j--): o5 e' W+ O% R" ^0 M5 C' U$ B
                    {2 M/ ]7 g" k* M7 u' R
                            /* floating date operation */( [! H  W. @/ k* J( J7 z6 M/ t
                    }

    / i3 t* v# |4 H. ]        }0 S$ Z3 L  j: [$ l1 Z7 P3 r# E
    }- Z% n& k% a, P* Q8 g, T. U2 v

    - a! I1 H7 Y5 f' Ixcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    ( L5 i- O7 ]7 o/ b& w
    $ A& n3 O. h7 T  E& x( I# N红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。7 |$ k3 x; y- w9 k
    现在call xcorr 100次,耗时78s.+ {$ t, c8 A  z' m
    0 v5 B6 e2 M1 o
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    ) G( K/ E4 t, d$ ]8 D5 _  f$ s2 s; B  d" m# Y
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
      F! n  P8 O7 U8 i2 g4 p1 OMaybe Debug mode?

    / r5 {# w3 l, ?" v$ W9 A0 Y( K+ C8 Y, O: Z( F1 G
    不应该,看我上面的回复。% v( V: x$ g: d- Y7 J

    * S7 b1 u: u( @& e2 D+ ]7 o我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-7-28 23:17
  • 签到天数: 1935 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    9 E9 E2 j. L2 l# b  o1 f
    雷达 发表于 2022-9-24 23:54
    ! D5 ~# h7 S, f4 Xvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    / @# J2 y8 y$ Y3 i{
    : Z& M# r. i/ T# M        comp temp, xtimesy;

    9 k% u: f7 k7 W1 L- L# n
    4 G3 W6 M( `8 N9 P0 r! y这个不是这么比的吧。。。
    3 O  z8 ]$ H3 a4 L
    1 j* K4 F& V: W6 U您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。; Q, }. b- i# b5 R9 I. q" t& F

    ! R1 W" y7 `# o; J$ F而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 % [# w; V$ x0 B; r
    数值分析 发表于 2022-9-25 00:20" N' m' h8 N- {7 j  C- _
    这个不是这么比的吧。。。
    / ?0 U8 z" B! f; a2 N3 k3 ^# L
    + @; @2 a" H( I. K( y& Q您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    # _* w3 c3 K/ o: V  t
    - a4 Z9 ]3 S' d9 o; P; b  H$ b" D
    有道理。
    : K2 i! j4 Q. K# j% H所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。/ Q  }" |4 ^# |, Q
    3 }0 j0 u/ z" w& J$ O$ B: g
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:467 P" [! c, S; I
    有道理。
    8 I, R/ k/ @8 ]( I+ d所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    - n* V% I) {& \! u. k* f
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多# C# j* u2 D( p
    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/ z, A& s8 C. M
    这个不是这么比的吧。。。3 I8 F3 w# G  b' Q* r( I
    9 y8 H3 ]6 ]. D" b: t# }
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    % C  B5 Y! v# {0 b) H, u. ~$ h  P

    2 J; H- M( @8 ^现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-7-28 23:17
  • 签到天数: 1935 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    " x6 y9 e- _: u& |; E' `
    沉宝 发表于 2022-9-25 01:48
    " t* P7 o8 v1 a8 r现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    ( f1 N2 o6 w$ K, f& Y6 Z2 ^

    ' c# f3 i  O: B0 Q是的,兄台说的对。
    ' S# u, a( O3 @* U2 n) y+ T' S: ?( n9 a/ ~+ q
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    / s% y' C; b( q+ a+ U0 |
    " |) M9 R8 z% v; Z7 S雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。, _: J3 g- Q9 i" x( o% N" L
    & T+ C) J$ ?$ d7 b9 b; C6 G, R
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。4 p0 L# L/ Q1 x% b  I2 D/ f

    3 Z6 ]; @3 Z9 K! L" ^* T+ |; o/ p) q当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 & a* x1 a9 s8 h
    沉宝 发表于 2022-9-25 01:27
    9 z4 g" b( m# y; J你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    ) t( r0 z5 a( `  o# [( Q2 `

    : n2 v/ R9 c6 Z' \又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。" X+ {) l7 L! C. k
    : I) T( R! R& u8 a4 s( H9 W8 F
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    9 h: O+ N/ ?4 s/ y, d2 [又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    4 P) g% i  s) ^" c# P
    时间差一倍的结果可以接受。
    , N1 x) r" {' t/ z' c* T' l3 r4 h$ f+ B: ]
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-7-28 23:17
  • 签到天数: 1935 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    4 F$ r* G8 w# ]
    雷达 发表于 2022-9-25 04:47; w: A' t1 L8 Y
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    * o$ J9 Z5 z2 p2 ]3 f
    ' g. A( P$ `8 j* a" O
    $ P0 E" a' B. q4 f6 o1 l
    8 B( B7 G# P  q能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑   k$ r+ }! z8 A5 `' X0 w' k
    数值分析 发表于 2022-9-25 14:58: f" k9 C! f9 X4 s
    能不能把这个也贴上来,看看和上一个有什么不同?

    * k: x* s4 K8 k+ ?, ]3 Y- U& X理了理思路,重新做了一个测试。
    7 r( o4 s' Y' e" p9 O% y做了两个 vector 和 两个 float *, 都长 100000
    2 r" u' q" P: e5 a2 d外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.# w; E& d- R8 U/ ]

    8 |* k1 H5 ~4 x内循环试了4种方法,+ L( o5 G! U1 W! t4 L4 R% }
    1. 直接调用 vector inner_product 247s 6 s  Z  c0 g4 i4 ~; T, c
    2. vector 循环点乘累加 237s
    : u% d5 T% M8 W6 G8 |  U( r* B% d3. float * 循环点乘累加 204s
      ]( K. H  I, F' w! M9 W/ k+ R+ i4. 空循环 100000 次 202s
    5 U' E5 X; Z6 K3 T* v% r+ w% A! J1 F
    不做内循环 200s
    / H9 }: s- Q; u- E4 |) j0 H1 |0 H5 v- v9 O9 q
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    8 I$ B, n6 ~9 N* J另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    2 v! @" n4 S0 a& u* m3 A8 [& b8 }+ a( L0 X  i
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)7 T* s1 _4 D6 B# o6 m. Z

    5 u9 D  i' X+ J' \1 i0 C2 e6 X(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)3 W2 A& b, m) D2 n* y. k8 ?# W

    : ]+ n, m& f# b; Q
            std::vector < float > vec1(N);9 o  n1 u  P  q# r: s, a: u' _) l
            std::vector < float > vec2(N);2 j2 Y5 r- I* u2 z0 ^3 m7 Q
            float* b1 = new float[N];
    0 @$ `+ o2 \  K$ n+ v0 i        float* b2 = new float[N];6 K+ n, v7 Z: c) y3 j" ?
    : e" T( R: e  D7 p# J9 [9 S/ O
            for (int j = 0; j < 6000; j++)4 O3 M) n2 l5 b
            {
    6 z: O0 Z( N  x' {2 e+ U                std::generate(vec1.begin(), vec1.end(), []() {
    7 m9 {+ k" i; ~5 }# z                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;  a4 w9 h0 ]$ r0 Q. r- K
                            });
    3 u; n9 D) t. I) `/ Z# t
    * |. }1 y4 t) D1 i+ @                std::generate(vec2.begin(), vec2.end(), []() {5 u* p1 Q3 C' i4 C
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;; V' E6 F3 W: [
                            });
    4 p& W/ r6 N( ^, O5 F+ i
    1 @/ g1 b  c% I; c# ~4 j: M' p  L                for (size_t jj = 0; jj < vec1.size(); jj++)' L" t: Z" {* E' o, ?
                    {
    ( t. w  l/ I0 u4 c$ `$ F                        b1[jj] = vec1[jj];
    * w6 q  l; r3 G" f4 ~+ t# l0 w- E" v                }8 d3 [0 C3 S1 V! l
    ' ~8 M  @, c, M! ]- d$ M
                    for (size_t jj = 0; jj < vec2.size(); jj++)4 e2 d3 i, b+ z  M" |
                    {& j2 P- G* r  C6 @+ @8 n0 Z: D
                            b2[jj] = vec2[jj];
    1 I2 `6 }8 X+ J3 q1 K                }# h9 V6 U: H- q8 h# A
    $ a  Q& z  E( ^9 H& R' z1 O+ S
                    //Method - 1  N=100000 247s  
    4 R/ _1 w9 n" ^- s1 b2 B                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    8 e0 ]( @0 D% H& Z0 s                                3 ?0 l. {# y; V7 V! H9 ?' A
                    //Method - 2  N=100000  237s7 o" x' b! |' J
                    /*
    9 G# _' d, M0 v                for (int jj = 0; jj < N ; jj++)
      D$ {9 v4 Q7 m                {
    ( t& w, }0 }" G: v- E  u                        fresult += vec1[jj] * vec2[jj];9 \: d4 K) A' W0 F8 [; N
                    }7 d) \& B2 P+ j+ b
                    */$ G' t6 y' g: F! ?
                                    - s+ t& R  v  q, a  e. w) T( p
                    //Method - 3  N=100000 204s
    : x  t: F& L; X5 {                /*8 _5 u* H* m. x& A) B
                    for (int jj = 0; jj < N; jj++)7 k( M) j5 L' |# p" S; A
                    {
    1 _% @* F; F- n* x5 E' |8 S+ M                        fresult += b1[jj] * b2[jj];
    ( o4 h. ]9 v  O! M. y* @/ l                }: ]- O4 v7 I& v( f3 t
                    */
    ' I6 K# C$ e: y8 w
    & a; V1 n5 J* T% e; ?. @                //Method - 4   202s+ g9 Q% X; x6 Z
                    /*
    ) q+ {- u/ d0 y6 U% l6 s* U4 {1 b                for (int jj = 0; jj < N; jj++)3 q1 |+ e7 p: i7 e0 v
                    {. G2 S7 K, G4 p# d
                            3 N7 _5 j* G" [; D- h* i
                    }
    $ g% S7 J  r' z0 i8 t( W9 S                */$ Q* m1 W5 r/ B; }0 z: b3 l
                    //comment out all methods, N=100000  202s               
    6 I  y# E" @( P0 d        }* \: A* A+ u9 d+ E6 E
    1 u2 A. R  {7 x* A+ Y# e  x
            delete []b1;
    ) a. b' I0 S. ?" C2 k5 z% i/ l2 @        delete []b2;
    ( V" i6 n5 ~0 G4 t0 J9 ]5 ~6 [% B
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?5 u. k" @/ L2 z8 t8 I

    ' O& G4 t6 s6 a6 C. X1 C你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    3 r# s4 j, ~8 b
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    : c* u7 S5 K; C( t5 V% [) o瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?" g3 Y. C( \! b
      A% W; |1 r  s
    你第二个试验里面的j在循环里面又重新定义 ...

    % L' C/ _6 C5 Y0 d3 D/ l内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ! P0 M# `+ |1 c- k
    & z8 F+ X/ h6 p  L- ^不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    ( H1 n8 N- `9 z- k. `内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ' t  d5 K# f) v+ Y2 @
    , x( h3 Y  @1 j不和它 ...
      D* j( ], X0 D

    5 S: K- }# J  E, A+ H不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
      B! {( o1 d* e, s7 I7 T后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54  c/ k" \5 ~/ s2 R
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)4 i; E  m' s; C
    {( p- A; g  U0 I
            comp temp, xtimesy;
    ( S+ Y! q3 c, E6 f' ?" _  l
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。5 P) ?7 F5 [( }8 T# l5 X
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?' g# y! E5 [- g* s3 `2 O
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-8-22 07:49 , Processed in 0.042972 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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