Android 中,我有一个 int[] a,里面大约有两百万个 int
每一个 a[i],经过一些简单的加减后,得到新的值
实测这样的操作将会花费惊人的数分钟时间,
请问如何加快这个速度?
目前想到的是每几个 a[i]开一个新的线程,改用 synchronizedList,
因为我看到耗时很长但是 CPU 占用率很低。
还有别的方法吗?
谢谢各位大佬不吝赐教,在下不尽感激
Android 中,我有一个 int[] a,里面大约有两百万个 int
每一个 a[i],经过一些简单的加减后,得到新的值
实测这样的操作将会花费惊人的数分钟时间,
请问如何加快这个速度?
目前想到的是每几个 a[i]开一个新的线程,改用 synchronizedList,
因为我看到耗时很长但是 CPU 占用率很低。
还有别的方法吗?
谢谢各位大佬不吝赐教,在下不尽感激
|
aheadleadApr 5, 2021
1
……最好的办法就是少存点
不过楼主可以详细描述下,或者直接贴代码 |
|
desApr 5, 2021 via iPhone
2
每次更新两百万个数据,想快也快不起来吧?
建议先想想,为啥每次需要更新这么多数据 |
|
3
@des 具体的场景是,有一个 bitmap (图片),读取每一个像素点的 rgb 值,修改后回去。这里的应用是修改图片亮度。
|
|
xupefeiApr 5, 2021 via iPhone
4
不要每几个值就开线程,把整个数组等分为 cpu 核数会更快。
|
|
5
安卓能调 gpu 算吗?
|
|
6
我看到其他人的代码,这一块是用 Ndk ( c++)实现的,但我不会 c++……
|
|
7
@xupefei 最后又要从 n 个合成 1 个数组,多了复制的开销吧
|
|
aheadleadApr 5, 2021
8
|
|
9
提交给服务器端,处理完成后返回给客户端 @@
|
|
aheadleadApr 5, 2021
10
没有封装好的库可以用吗?
|
|
11
@aheadlead native 是指 ndk 吗,方便展开说说不
|
|
12
用 opencv 不好吗,直接算矩阵不比你循环算数组快……
|
|
13
建议用 colorMatrix
|
|
desApr 5, 2021 via iPhone
14
首先图像计算建议用图像库
要自己搞的话,你这明显有可以优化的地方 一是颜色一般只需要存 255,你这浪费了好多 然后黑白图又可以省好多 还有是可以用 gpu 加速 |
|
aheadleadApr 5, 2021
15
|
|
arelessApr 5, 2021
16
gpu.js 或者 webgl2 走 GPU 加速的。你只需要一个 headless 浏览器
|
|
17
图像处理不是这么搞的。。。
用 C++主要是因为可以用 SIMD 指令,但是一般来说如果只是做你说的亮度处理,不应该在图像本身上面搞。 通常会做一个类似管道的东西,把图像数据通过一系列操作映射成显示用的 view 数据,一般就是 rgb256 数组。你这个操作应该在管道上去搞,换句话说就是 view 层面的东西。 你还是找个图像库去弄吧。。。 |
|
aheadleadApr 5, 2021
18
我想起了以前有个 skia 库,曾经还跟他斗智斗勇来着
|
|
xupefeiApr 5, 2021 via iPhone
19
@lithium148 内存复制快还是你的锁快?
|
|
20
虽说图像处理一律建议使用现成的库,但是两百万个整数,每个元素仅仅是简单的加减,那这数据量一点都不多,运行时间几分钟肯定是代码写错了。别听楼上说的整什么多线程、SIMD 、GPU,我看还是先把代码写对吧。
|
|
22
你不会是在视图线程上算的吧 卡 UI 了
|
|
trn4Apr 5, 2021 via iPhone
23
单纯 200w 个 int 循环一次加减应该还到不了秒级的时间,几十~几百 ms
|
|
24
图片的 RGB 是通过一个二组数组来储存的,这就提示你,可以使用矩阵运算来加速;但是楼主你却把这个二维数组拉成一个一组的数组,一个一个像素点来运算,速度慢是应该的。图像处理领域需要大量的矩阵运算.需要丰富的线性代数的知识储备。
|
|
mxT52CRuqR6o5Apr 6, 2021 via Android
25
同意楼上的说法,才几百万就算个几分钟是代码就没写对,还没到需要折腾乱七八糟技巧的时候
|
|
acrossApr 6, 2021
26
图片亮度就是统一加 rgb,交给 gpu 做很快( OpenGL ES )。
但我记得 android 上有一类 api,专门封装了针对图片的 gpu 操作(不是 GPUImage ),忘了叫啥了···· |
|
27
搜了下是 import android.graphics.Bitmap;
一搜就看到了 https://blog.csdn.net/gf771115/article/details/40778091 |
|
BugenZhaoApr 6, 2021 via iPhone
28
|
|
29
我怀疑他代码,每计算一次加减,就重排列一次数组...所以计算量是 n*200 万次..
|
|
keenkillerApr 6, 2021
30
原地修改的话不可能这么慢
|
|
honeyshine75Apr 6, 2021
31
矩阵计算
|
|
dadachen1997Apr 6, 2021
32
矩阵运算库找找看?
|
|
takatoApr 6, 2021
33
对于这个情况比较合理的性能情况应该是多少呢?
我做了一个小测试,randn 一个 shape 为 7000,1000 的 f32 array 做 sum(axis=1)运算 numpy 跑了 4.6ms rust 手写跑了 6ms,并行化后 2ms gpu 性能不能看,运算本身很快,但是把数据扔进 cuda 慢得要死。。。 比较想知道这样的情形在使用单台 PC 的情况下大概能优化到什么程度? |
|
ReputationZhApr 6, 2021
34
real 0m0.023s
user 0m0.016s sys 0m0.000s |
|
domodomoApr 13, 2021
35
time ./test
./test 0.02s user 0.00s system 87% cpu 0.022 total 我的哥,你写的啥程序啊,200 万 int 随机加减,0.022 秒就完成了啊 |