收藏
回答

IOS上纯运算效率低下,同计算量竟然比android慢20倍

问题模块 框架类型 问题类型 终端类型 操作系统 微信版本 基础库版本
框架 小程序 Bug 客户端 6.6.7 2.2.2

业务需要在canvas上实现模糊效果,在模糊计算时发现IOS上对计算速度要慢很多倍。

提出代码片段进行测试发现,在iphone X上计算耗时(纯运算过程)22822ms, 小米 MIX 2上耗时928ms, 模拟器上运算耗时384ms。在其他ios 和android机型测试都是相同情况。两者耗时竟然相差20多倍。


iphoneX

Mix 2


模糊运算代码

function blurUint8Array(uint8Arr, width, height, blur) {
  var result = new Uint8ClampedArray(width * height * 4);
  var source = uint8Arr.slice()
  var bxs = boxesForGauss(blur, 3)
  boxBlurUint8(source, result, width, height, (bxs[0] - 1) / 2)
  boxBlurUint8(result, source, width, height, (bxs[1] - 1) / 2)
  boxBlurUint8(source, result, width, height, (bxs[2] - 1) / 2)
  return result
}
 
function boxBlurUint8(scl, tcl, w, h, r) {
  for (var i = 0; i < h; i++) {
    for (var j = 0; j < w; j++) {
      var R = 0
      var G = 0
      var B = 0
      var A = 0
      for (var iy = i - r; iy < i + r + 1; iy++) {
        for (var ix = j - r; ix < j + r + 1; ix++) {
          var x = Math.min(w - 1, Math.max(0, ix))
          var y = Math.min(h - 1, Math.max(0, iy))
          var index = (y * w + x) * 4
          R += scl[index]
          G += scl[index + 1]
          B += scl[index + 2]
          A += scl[index + 3]
        }
      }
      var count = (r + r + 1) * (r + r + 1)
      var tIndex = (i * w + j) * 4
      tcl[tIndex] = R / count
      tcl[tIndex + 1] = G / count
      tcl[tIndex + 2] = B / count
      tcl[tIndex + 3] = A / count
    }
  }
}
function boxesForGauss(sigma, n) {
  var wIdeal = Math.sqrt((12 * sigma * sigma / n) + 1);
  var wl = Math.floor(wIdeal);
  if (wl % 2 === 0) wl--;
  var wu = wl + 2;
 
  var mIdeal = (12 * sigma * sigma - n * wl * wl - 4 * n * wl - 3 * n) / (-4 * wl - 4);
  var m = Math.round(mIdeal);
 
  var sizes = [];
  for (var i = 0; i < n; i++) sizes.push(i < m ? wl : wu);
  return sizes;
}


最后一次编辑于  2018-08-16  (未经腾讯允许,不得转载)
邀请回答
复制链接收藏投诉关注问题回答

2 个回答

  • 围城
    围城
    2018-08-16

    在ios上 Math函数实现貌似有些问题,我把min max函数替换成三元后快了一倍, 但还是比Android慢。之前在使用Math.round的时候也出现了问题,具体场景记不清了。希望官方大佬给关注一下这个Math的问题。

    2018-08-16
    赞同
    回复
  • Rui.L
    Rui.L
    2018-09-30

    之前使用了一个高斯模糊的实现,遇到过,不过不是那么离谱,大概差5倍是有的。

    2018-09-30
    赞同
    回复