android的编译版本是否直接影响性能?

新手上路,请多包涵

最近开发的时候,需要使用到二维码扫描功能,于是本着程序猿的“分享精神”,从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各个编译版本的性能差异,以对应自己的开发需求选择合适的版本?

阅读 2k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题