Skip to content
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(不使用皮肤)
  • 不使用皮肤
折叠
CFD中文网

CFD中文网

  1. CFD中文网
  2. Algorithm
  3. 可以讨论一个编程问题吗?这样写C++代码效率为何这么低?

可以讨论一个编程问题吗?这样写C++代码效率为何这么低?

已定时 已固定 已锁定 已移动 Algorithm
19 帖子 5 发布者 14.2k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • 悬 离线
    悬 离线
    悬铃神木
    在 中回复了 李东岳 最后由 编辑
    #10

    7.415S,确实快了一些。但是这样写相当于改变了两个被乘数组之一,这样限制了它的使用方式,像C=A+A*B这样的或者更复杂的表达式就很难写了。我试了一下,确实如楼下所言是优化的问题,零优化情况下就和直接用数组的方式没有这么大的差距。

    1 条回复 最后回复
  • 悬 离线
    悬 离线
    悬铃神木
    在 中回复了 wwzhao 最后由 李东岳 编辑
    #11

    谢谢您的回答!试了一下确实是编译器优化带来的问题,我在linux系统下使用g++编译这串代码,以下分别是优化等级-O0(无优化)、-O1、-O2、-O3时得到的运行速度:

    -O0
    Time1 = 47.759S
    Time2 = 29.2934S
    -O1
    Time1 = 16.7366S
    Time2 = 4.35349S
    -O2
    Time1 = 11.9593S
    Time2 = 1e-06S
    -O3:
    Time1 = 12.2002S
    Time2 = 0S
    

    可见无优化时虽然我这种使用类的写法也要慢一些,但两者在一个数量级上,优化等级越高,直接使用数组的方法优势就越大了……
    编译器的优化好神奇哦!:duang:
    看来以后还是尽量去用别人写的成熟的函数库吧…… :huahua:

    1 条回复 最后回复
  • Z 离线
    Z 离线
    Zephyr
    写于 最后由 编辑
    #12

    你的new/delete是罪魁祸首,loop 1000000次意味着你new/delete了1000000次array C,尽量不要动态分配内存,除非你有不得不这样写的原因。如果你知道你要在代码里反复使用A, B, C三个矩阵,你应该一开始就分配好而不是在结构体里new。matlab里你可以随便写C = A + B 是因为matlab已经替你做了内存管理,你自己写代码的时候就要做到方方面面兼顾了。

    悬 1 条回复 最后回复
  • 悬 离线
    悬 离线
    悬铃神木
    在 中回复了 Zephyr 最后由 编辑
    #13

    谢谢您的回答!我试了下不使用动态分配而用固定大小的数组p[10000]来代替,确实提高了一些效率,从10S+变成了7S+。
    但我这里确实需要动态分配,因为我希望做成一个有一定通用性的矩阵类来储存各种流场信息,我无法在编程时就知道需要多大内存,也许这次计算只要几千网格,也许下次就需要几千万网格。

    Z 1 条回复 最后回复
  • Z 离线
    Z 离线
    Zephyr
    在 中回复了 悬铃神木 最后由 编辑
    #14

    @悬铃神木 thrust, boost这些库都挺不错的。。

    悬 1 条回复 最后回复
  • 悬 离线
    悬 离线
    悬铃神木
    在 中回复了 Zephyr 最后由 编辑
    #15

    @Zephyr 嗯嗯,感谢,我去尝试一些库

    李东岳李 1 条回复 最后回复
  • 李东岳李 离线
    李东岳李 离线
    李东岳 管理员
    在 中回复了 悬铃神木 最后由 编辑
    #16

    @悬铃神木 你测试的结果是不是调用100000次构造函数和1次的区别不大?

    目前我在每个网格都构造一次构造函数,琢磨要不要把这个删掉

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    悬 1 条回复 最后回复
  • 悬 离线
    悬 离线
    悬铃神木
    在 中回复了 李东岳 最后由 编辑
    #17

    是的,调用1000000次构造函数和1次,带来的差别不大

    1 条回复 最后回复
  • 李东岳李 离线
    李东岳李 离线
    李东岳 管理员
    写于 最后由 编辑
    #18

    感谢分享 楼主好人

    :xiexie: :xiexie: :xiexie: :xiexie:

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    悬 1 条回复 最后回复
  • 悬 离线
    悬 离线
    悬铃神木
    在 中回复了 李东岳 最后由 编辑
    #19

    是我应该感谢cfd中文网的各位老师,对我的帮助很大.
    :xiexie: :xiexie: :xiexie: :xiexie: :xiexie: :xiexie: :xiexie: :xiexie:
    另外,我测试的这个构造函数和析构函数只承担了new和delete一个double[]的任务,如果是功能更复杂的构造函数,就不好说了。

    1 条回复 最后回复

  • 登录

  • 登录或注册以进行搜索。
  • 第一个帖子
    最后一个帖子
0
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]