Our world is worth fighting for

—— Mei-Ling Zhou

如何写出更高效的代码?

15 May 2017

程序员亘古不变的追求: 更快的代码运行速度,更小的资源占用。

*警告*: 本文所列出的均为“可以尝试的”方法。有的可能在你的环境根本不起作用。有的则能产生很好的效果。

如何写出更高效的代码? 写代码时可以注意这几个方面。(基本都来自于《code complete 2》一书, 郑重推荐!)

逻辑

  • 知道答案后立刻退出。

伪代码:

for i =0; i< count; i++ {
    if i == 3 {
        print("hi, there!")
    }
}

知道答案后依然在loop. 更好的方式为找到3以后立刻停止,在print 之后添加break

  • 按照出现频率来调整判断顺序。

伪代码:

select "string" {
case "0" to "9":
    print("hi, there!")
case "a" to "z", "A" to "Z":
    print("hi, there!")
case " ":
    print("hi, there!")
}

可以把最常出现的放到前面。 修改如下:

select "string" {
case "a" to "z", "A" to "Z":
    print("hi, there!")
case "0" to "9":
    print("hi, there!")
case " ":
    print("hi, there!")
}

这个方法在 case match 以后 直接break 的语言会很好用 如: go。 像java这样不会自动break 则没有任何效果。但可以结合 方法1使用。

loops

  • 将判断外提

伪代码:

for i = 0; i < count; i++ {
    if name == "arion" {
        print("arion")
    } else {
        print("hi, there.")
    }
}

修改为:

if name == "arion" {
    for i = 0; i < count; i++ {
        print("arion")
    }
} else {
    for i = 0; i < count; i++ {
        print("hi there.")
    }
}

这样代码不是更丑了吗? 而且更难维护。!! 但是你可以让人无法接手你的代码阿–! 你就是那个无法取代的崽er.(玩笑) 其实我们可以让这段代码更容易维护一些,你想想。

  • 尽量减少在循环内做的工作。

伪代码:

for i = 0 ; i < count; i++{
    all[i] = a[i] + b * 4 +3 
}

修改为:

c = b*4+3 
for i = 0; i < count; i++ {
    all[i] = a[i] + c
}

这样不仅可以提高代码的性能还能改善代码的可读性。 当然像上面示例一样的 用b c 这样的变量名 怕不是会被喷死。

  • 把最忙的循环放在最内层。

伪代码:

for col = 0; col<100; col ++ {
   for row = 0; row<5; row ++ {
       sum += col *row
   }

}

分析下 我们 执行了 100次外部循环, 100 *5 次 内部循环 一共600。

修改为:

for row = 0; row < 5; row ++ {
for col = 0; col <100; col++ {
    sum += col*row
}

}

这次我们执行了 5次外部循环。 5 * 100 次内部循环, 一共505次

数据

  1. 能用整型就就不用浮点。
  2. 数组维度尽可能的少。
  3. 使用缓存。 从内存拿永远比硬盘io快。

说到缓存。如果创建新元素的代价越大,请求相同信息的次数越多,缓存就越有价值。