数组里有百万个值,如何加快速度?

2021-04-05 18:44:40 +08:00
 lithium148

Android 中,我有一个 int[] a,里面大约有两百万个 int

每一个 a[i],经过一些简单的加减后,得到新的值

实测这样的操作将会花费惊人的数分钟时间,

请问如何加快这个速度?

目前想到的是每几个 a[i]开一个新的线程,改用 synchronizedList,

因为我看到耗时很长但是 CPU 占用率很低。

还有别的方法吗?

谢谢各位大佬不吝赐教,在下不尽感激

4277 次点击
所在节点    编程
35 条回复
chocovon
2021-04-05 21:05:51 +08:00
@nlzy 确实,200w 个 int 应该是秒算的
hahasong
2021-04-05 22:49:30 +08:00
你不会是在视图线程上算的吧 卡 UI 了
xiadong1994
2021-04-05 23:48:35 +08:00
单纯 200w 个 int 循环一次加减应该还到不了秒级的时间,几十~几百 ms
mekingname
2021-04-05 23:58:00 +08:00
图片的 RGB 是通过一个二组数组来储存的,这就提示你,可以使用矩阵运算来加速;但是楼主你却把这个二维数组拉成一个一组的数组,一个一个像素点来运算,速度慢是应该的。图像处理领域需要大量的矩阵运算.需要丰富的线性代数的知识储备。
mxT52CRuqR6o5
2021-04-06 00:07:10 +08:00
同意楼上的说法,才几百万就算个几分钟是代码就没写对,还没到需要折腾乱七八糟技巧的时候
across
2021-04-06 00:16:08 +08:00
图片亮度就是统一加 rgb,交给 gpu 做很快( OpenGL ES )。
但我记得 android 上有一类 api,专门封装了针对图片的 gpu 操作(不是 GPUImage ),忘了叫啥了····
across
2021-04-06 00:19:51 +08:00
搜了下是 import android.graphics.Bitmap;
一搜就看到了 https://blog.csdn.net/gf771115/article/details/40778091
BugenZhao
2021-04-06 00:31:54 +08:00
Marszm
2021-04-06 08:40:21 +08:00
我怀疑他代码,每计算一次加减,就重排列一次数组...所以计算量是 n*200 万次..
tairan2006
2021-04-06 10:17:20 +08:00
原地修改的话不可能这么慢
honeyshine75
2021-04-06 10:36:13 +08:00
矩阵计算
dadachen1997
2021-04-06 13:20:29 +08:00
矩阵运算库找找看?
takato
2021-04-06 13:57:24 +08:00
对于这个情况比较合理的性能情况应该是多少呢?
我做了一个小测试,randn 一个 shape 为 7000,1000 的 f32 array 做 sum(axis=1)运算
numpy 跑了 4.6ms
rust 手写跑了 6ms,并行化后 2ms
gpu 性能不能看,运算本身很快,但是把数据扔进 cuda 慢得要死。。。

比较想知道这样的情形在使用单台 PC 的情况下大概能优化到什么程度?
ReputationZh
2021-04-06 14:28:44 +08:00
real 0m0.023s
user 0m0.016s
sys 0m0.000s
domodomo
2021-04-13 03:41:12 +08:00
time ./test
./test 0.02s user 0.00s system 87% cpu 0.022 total

我的哥,你写的啥程序啊,200 万 int 随机加减,0.022 秒就完成了啊

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

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

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

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

© 2021 V2EX