C 语言 循环下 创建动态数组 非常慢 应该如何解决

2022-07-05 16:07:03 +08:00
 hhhhhh123

我简单阐述下背景: 我不是专业 C 开发人员, 我是 python 开发。 因为 python 部分功能实现慢,故使用 C 来重写然后进行封装动态库进行调用。 所有项目用的是 C 不是 C++ 。 目前是已经完成了 速度也有很大的提升。 但是我发现应该还能提升 。 下面代码就是一个例子。。

我要循环一个很大的值 百万级别甚至上亿。 然后动态数组, 但是这个创建动态数组非常慢,各位 C 大佬有什么方法可以解决吗? 还是说我的操作有问题??? 非专 C 人员,勿喷, 如果可以的话,救救孩纸吧.

下面迭代了 132963138 次数的耗时情况

for (int ii = 0; ii < arr_cnt_copy; ii++) {

count += 1;
int min_score = 7462; // 200 ms
int* res_card_lst = (int*)malloc(c_ * sizeof(int)); // 25s

}

2683 次点击
所在节点    C
35 条回复
mepwang
2022-07-05 16:11:24 +08:00
不要用循环,一次性分一大块内存,然后用指针运算来寻址
hhhhhh123
2022-07-05 16:11:26 +08:00
上面一亿+次 迭代 还是算中等 次数, 呜呜呜 python 计算的话 要个把小时 还是 C 牛逼
hhhhhh123
2022-07-05 16:11:49 +08:00
@mepwang 可以详细说说吗? 我不是很懂 现学现用
ysc3839
2022-07-05 16:12:54 +08:00
怀疑是 X-Y Problem https://coolshell.cn/articles/10804.html
建议直接说原始需求
hsfzxjy
2022-07-05 16:13:39 +08:00
不清楚你要的业务逻辑,但如果有可能的话,把内存申请拿到循环外来做。
hhhhhh123
2022-07-05 16:13:44 +08:00
@ysc3839 需求可就太多了 一下次说不太情况
westoy
2022-07-05 16:14:08 +08:00
malloc 怎么可能耗时 25s , 应该是其他地方有问题
hhhhhh123
2022-07-05 16:16:37 +08:00
@hsfzxjy 我是不是可以理解为, 在循环外 创建数组 然后循环内使用, 使用完后在删除数组里面的元素? 这样就省了创建过程?
hhhhhh123
2022-07-05 16:17:07 +08:00
@westoy 这个是真实的 测试代码就一个循环 一个计数 一个创建动态数组 和上面一样的
3dwelcome
2022-07-05 16:20:36 +08:00
我以前也觉得 malloc 不慢,后来查 BUG ,才发现把内存分配放在循环里,确实很慢。

预分配吧,没其他太好的办法。
SmallZheng
2022-07-05 16:22:56 +08:00
直接一次性申请 c_ * sizeof(int) * arr_cnt_copy 这么多,再自己分配
Hallelu
2022-07-05 16:25:31 +08:00
是的,将 malloc 拿出来,在循环外进行分配内存,空间换时间,大概算了下,一千万次概 38MB 左右,表示也还好
hhhhhh123
2022-07-05 16:32:21 +08:00
兄弟们, 报喜了。。。。是要拿出来快很多了。 感谢各位。。 我也蠢了 唉 ,, 在外面定义数组 , 然后里面会赋值,下一次循环又重新赋值 这个操作 比在里面重新创建要快很多 。。。
hhhhhh123
2022-07-05 16:33:58 +08:00
谢谢各位 i 。。解决了一个 速度问题, 我去找另外的速度问题去了 。。 么么哒
BrettD
2022-07-05 17:04:42 +08:00
你为什么要在循环里面申请内存呢
yolee599
2022-07-05 17:05:19 +08:00
一般这种情形都是自己撸一个内存池( doge )。我个人是不喜欢频繁使用 malloc ,free 的,最好就是一开始就预计好要使用的空间,一次性分配好,使用到程序结束
qunqun
2022-07-05 17:07:47 +08:00
纯好奇,即使 Python 也要预分配吧
villivateur
2022-07-05 17:09:59 +08:00
因为 malloc 是个比较耗时的过程
ty359
2022-07-05 17:38:31 +08:00
你这是完全没有 free 这块内存吧,C/C++初学者不要用 malloc 或者 new 这类动态内存使用方式,直接上 STL 容器对你来说容易一些。
hhhhhh123
2022-07-05 17:49:20 +08:00
@ty359 C 也有 vector 这种吗? 不是 C++才有吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/864227

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX