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

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

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

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

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

请问如何加快这个速度?

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

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

还有别的方法吗?

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

4255 次点击
所在节点    编程
35 条回复
aheadlead
2021-04-05 18:45:42 +08:00
……最好的办法就是少存点

不过楼主可以详细描述下,或者直接贴代码
des
2021-04-05 18:49:37 +08:00
每次更新两百万个数据,想快也快不起来吧?
建议先想想,为啥每次需要更新这么多数据
lithium148
2021-04-05 18:56:09 +08:00
@des 具体的场景是,有一个 bitmap (图片),读取每一个像素点的 rgb 值,修改后回去。这里的应用是修改图片亮度。
xupefei
2021-04-05 18:57:33 +08:00
不要每几个值就开线程,把整个数组等分为 cpu 核数会更快。
kera0a
2021-04-05 19:00:33 +08:00
安卓能调 gpu 算吗?
lithium148
2021-04-05 19:00:35 +08:00
我看到其他人的代码,这一块是用 Ndk ( c++)实现的,但我不会 c++……
lithium148
2021-04-05 19:05:24 +08:00
@xupefei 最后又要从 n 个合成 1 个数组,多了复制的开销吧
aheadlead
2021-04-05 19:06:48 +08:00
@lithium148 #3 这应该算是典型的用 native 的场景吧。。

(不过我不是 app developer…
akira
2021-04-05 19:06:58 +08:00
提交给服务器端,处理完成后返回给客户端 @@
aheadlead
2021-04-05 19:07:21 +08:00
没有封装好的库可以用吗?
lithium148
2021-04-05 19:10:46 +08:00
@aheadlead native 是指 ndk 吗,方便展开说说不
Muniesa
2021-04-05 19:11:29 +08:00
用 opencv 不好吗,直接算矩阵不比你循环算数组快……
xmumiffy
2021-04-05 19:12:04 +08:00
建议用 colorMatrix
des
2021-04-05 19:12:55 +08:00
首先图像计算建议用图像库
要自己搞的话,你这明显有可以优化的地方
一是颜色一般只需要存 255,你这浪费了好多
然后黑白图又可以省好多
还有是可以用 gpu 加速
aheadlead
2021-04-05 19:15:50 +08:00
@lithium148 #11 我以前是做手机的 framework native 和 kernel 的… app 的 NDK 不算太熟

不过我觉得你这个场景 100%有成熟的 library 可以用
areless
2021-04-05 19:17:33 +08:00
gpu.js 或者 webgl2 走 GPU 加速的。你只需要一个 headless 浏览器
Mithril
2021-04-05 19:22:43 +08:00
图像处理不是这么搞的。。。
用 C++主要是因为可以用 SIMD 指令,但是一般来说如果只是做你说的亮度处理,不应该在图像本身上面搞。
通常会做一个类似管道的东西,把图像数据通过一系列操作映射成显示用的 view 数据,一般就是 rgb256 数组。你这个操作应该在管道上去搞,换句话说就是 view 层面的东西。
你还是找个图像库去弄吧。。。
aheadlead
2021-04-05 19:38:30 +08:00
我想起了以前有个 skia 库,曾经还跟他斗智斗勇来着
xupefei
2021-04-05 19:40:08 +08:00
@lithium148 内存复制快还是你的锁快?
nlzy
2021-04-05 20:49:46 +08:00
虽说图像处理一律建议使用现成的库,但是两百万个整数,每个元素仅仅是简单的加减,那这数据量一点都不多,运行时间几分钟肯定是代码写错了。别听楼上说的整什么多线程、SIMD 、GPU,我看还是先把代码写对吧。

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

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

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

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

© 2021 V2EX