最近开发的时候,需要使用到二维码扫描功能,于是本着程序猿的“分享精神”,从github上弄了个zxingdemo,demo扫码速度可以,我很满意,于是心怀感恩之心地将其引入到我的程序中。
但运行起来,发现的我的程序扫码速度慢得可以,排除了各项差异后,还是没有改善。于是我去追踪运行时间,就在DecodeHandler中的decode,发现自己程序的耗时远多于网上那个demo。
最后实在无计可施,我在想该不会是编译版本引起的运行速率差异吧。果然将编译版本更改过后(网上的demo编译版本为23.0.3,我的程序的版本是25.0.0),解码速度快了一大截,使用起来也完全符合预期了。
以下是降低了编译版本后的log信息:
07-14 09:55:46.687 32062-32393/com.lkl.card.value D/DecodeHandler: handleMessage: decode
07-14 09:55:46.693 32062-32393/com.lkl.card.value D/DecodeHandler: decode size:1280,720
07-14 09:55:46.693 32062-32393/com.lkl.card.value D/DecodeHandler: decode data length is 1382400
07-14 09:55:46.762 32062-32393/com.lkl.card.value D/DecodeHandler: 第 1 次事件间隔为:41
07-14 09:55:46.762 32062-32393/com.lkl.card.value D/DecodeHandler: 第 2 次事件间隔为:27
07-14 09:55:46.771 32062-32062/com.lkl.card.value D/CaptureActivityHandler: handleMessage: decode_failed
07-14 09:55:46.954 32062-32393/com.lkl.card.value D/DecodeHandler: handleMessage: decode
07-14 09:55:46.961 32062-32393/com.lkl.card.value D/DecodeHandler: decode size:1280,720
07-14 09:55:46.961 32062-32393/com.lkl.card.value D/DecodeHandler: decode data length is 1382400
07-14 09:55:47.064 32062-32393/com.lkl.card.value D/DecodeHandler: 第 1 次事件间隔为:74
07-14 09:55:47.064 32062-32393/com.lkl.card.value D/DecodeHandler: 第 2 次事件间隔为:29
07-14 09:55:47.070 32062-32062/com.lkl.card.value D/CaptureActivityHandler: handleMessage: decode_failed
以下是25.0.0下的log信息:
07-14 10:25:41.374 32399-32649/com.lkl.valuecard D/DecodeHandler: handleMessage: decode
07-14 10:25:41.386 32399-32649/com.lkl.valuecard D/DecodeHandler: decode size:1280,720
07-14 10:25:41.387 32399-32649/com.lkl.valuecard D/DecodeHandler: decode data length is 1382400
07-14 10:25:43.419 32399-32649/com.lkl.valuecard D/DecodeHandler: 第 1 次事件间隔为:1385
07-14 10:25:43.419 32399-32649/com.lkl.valuecard D/DecodeHandler: 第 2 次事件间隔为:646
07-14 10:25:43.428 32399-32399/com.lkl.valuecard D/CaptureActivityHandler: handleMessage: decode_failed
07-14 10:25:43.591 32399-32649/com.lkl.valuecard D/DecodeHandler: handleMessage: decode
07-14 10:25:43.598 32399-32649/com.lkl.valuecard D/DecodeHandler: decode size:1280,720
07-14 10:25:43.598 32399-32649/com.lkl.valuecard D/DecodeHandler: decode data length is 1382400
07-14 10:25:45.373 32399-32649/com.lkl.valuecard D/DecodeHandler: 第 1 次事件间隔为:1214
07-14 10:25:45.373 32399-32649/com.lkl.valuecard D/DecodeHandler: 第 2 次事件间隔为:561
07-14 10:25:45.391 32399-32399/com.lkl.valuecard D/CaptureActivityHandler: handleMessage: decode_failed
07-14 10:25:45.424 32399-32649/com.lkl.valuecard D/DecodeHandler: handleMessage: decode
07-14 10:25:45.427 32399-32649/com.lkl.valuecard D/DecodeHandler: decode size:1280,720
07-14 10:25:45.428 32399-32649/com.lkl.valuecard D/DecodeHandler: decode data length is 1382400
07-14 10:25:47.362 32399-32649/com.lkl.valuecard D/DecodeHandler: 第 1 次事件间隔为:1283
07-14 10:25:47.362 32399-32649/com.lkl.valuecard D/DecodeHandler: 第 2 次事件间隔为:651
07-14 10:25:47.375 32399-32399/com.lkl.valuecard D/CaptureActivityHandler: handleMessage: decode_failed
最后是我打log的位置:
private void decode(byte[] data, int width, int height) {
Size size = activity.getCameraManager().getPreviewSize();
Log.d(TAG, "decode size:"+size.width+","+size.height);
Log.d(TAG, "decode data length is "+data.length);
Date start = new Date();
// 这里需要将获取的data翻转一下,因为相机默认拿的的横屏的数据
byte[] rotatedData = new byte[data.length];
for (int y = 0; y < size.height; y++) {
for (int x = 0; x < size.width; x++)
rotatedData[x * size.height + size.height - y - 1] = data[x + y * size.width];
}
Date second = new Date();
// 宽高也要调整
int tmp = size.width;
size.width = size.height;
size.height = tmp;
Result rawResult = null;
PlanarYUVLuminanceSource source = buildLuminanceSource(rotatedData, size.width, size.height);
if (source != null) {
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
try {
rawResult = multiFormatReader.decodeWithState(bitmap);
} catch (ReaderException re) {
// continue
} finally {
multiFormatReader.reset();
}
}
Date third = new Date();
TimeUtil.showUpTime(TAG,start,second,third);
结语:经过实践,编译版本直接影响程序的运行速度,但为什么版本低反而运行得快呢?是否因为我使用的zxing的版本较低,需匹配低版本的编译版本才可发挥其性能?还有就应如何认识android各个编译版本的性能差异,以对应自己的开发需求选择合适的版本?