众所周知,现在的单核计算机处理器其运行性能已几乎达到顶点。
为了取得更高的运行速度,现在的处理器已经向着,多核发展。
多核意味着一台电脑拥有更高的并行处理速度。
但是,多核也为软件的研发带来了新的挑战。
众所周知,人的大脑思维逻辑是按照步骤一步一步来处理问题的。
同时只能做一个操作。而多核并行则需要改变我们的传统思维习惯。
如何编写一段可以并行运行的程序。成了我们程序员所必需面临的问题。
1.值得称赞的是软件帝王Microsoft 公司在他的新型语言。
.net Framework 3.5种加入了一种叫做Linq的技术,使得程序员在一定程度上的数据并行处理不再需要程序员自己动手编写,只要你告诉程序想要什么就可以。而不必告诉他怎么做。
其内部已经实现了并行算法。
2.在windows的多数操作系统中也是默认支持多处理器,多内核的。
3.window系统的消息处理机制,也使得多处理器的并行运算提供了良好的切入点。
综上所需,并行运算问题是一个比较复杂的问题。
而本文想阐述的并不是关于并行运算的算法。而是讨论如何让单核计算更上一层楼。
所有的计算机专业人员应该都知道,数据结构在程序设计中的重要性。
比如数组,矩阵,链表,堆栈,树,集合,还有图,字典等等。
与这些对应的数据结构都有对应的处理算法。
比如数组的插入,排序,查找 运算。
集合的交,并,差运算
图的搜索。
树的遍历 等等。
有人说 算法的核心问题是排序和搜索。
有人会说这些运算算法目前都已经实现。而且运行良好,有什么问题吗?
单从实现结果上来说,这些并没有任何异议。问题是这些算法和数据结构目前是怎么实现的。
就拿我们程序中用的最多的数组的查找算法来说。其最快的算法应该是二分查找法。我们的程序中几乎每10行代码里面就有7行会涉及到搜索。(肯定有人不相信,不信你自己仔细推敲下你的代码!)
尤其是解释执行型语言,更是高达 90% 的概率。恰恰大家都喜欢解释型语言。因为简洁,易懂。比如javascript
我们的计算机之所以展现出如此绚丽多彩的效果,90%都得归功于搜索算法。
无论是图形图像,多媒体,游戏,文字处理还是数据处理。都离不开搜索。
搜索的用途实在是太广了。
但是我们回顾一下现在的单核计算机是如何实现搜索的。
Move
JUMP
..
…
等等10步左右的汇编机器指令。
而且搜索的时间与被搜索的数据量大小有关。
数据量越大,搜索时间越长。(当然有人说,我们有哈希算法阿。(哦哦,我忘记哈希算法了)哈希算法只适合在超大数据量的情况下显现出它的优点。
我的程序中总不能任何一个数组都用哈希表吧。
我们现在的程序就像是程序员在沙滩上盖大楼。
而地基只是两个功能简单的柱子,一个是聪明的分支跳转if语句,另外一个是永远不知疲劳的for循环。
就是这两个伟大的柱子支撑起了我们整个软件界。
我们的系统皆由此两个柱子加上我们程序员伟大的魔法般的艺术创造力,创建而成。
对于软件来说,计算机给我们提供的功能太单一了。我们必须按照计算机所会的东西去创造我们想要的东西。
就连简单的查找还需要我们告诉它怎么做。
值得庆幸的是我们学会了封装,学会了重用。
让大家不必再重复相同的思考。
但是封装给我们带来了,无尽的学习,无尽的可能,还有无知。
大家都是人,大家都能创造不同的封装。
所以大家都停留在创造相同的东西。 不可避免的会重复发明轮子。
虽然这种问题我们尽量避免,但还是或多或少的需要重复发明轮子。
更大的问题是,封装给我们的带来了复杂,带来了难以维护。难以理解。
却并没有带来性能上的提升。
虽然我喜欢封装我的东西。但是我却讨厌看别人封装后的东西。
每一个程序员在沉迷于创造程序时,就像我家的宝宝沉迷于在沙滩上创造城堡。
虽然很有艺术,很有挑战,更能收获成功的喜悦。
但是我们创造的东西是那么弱不禁风。
所以我认为,我们应该反省,不应该继续沉迷在只用两个柱子盖大楼。
我们需要更多的材料,原装的数组,原装的集合。
计算机硬件为我们提供的。
我们应该开发每种数据结构所对应的芯片,我们的计算机结构需要修改。
就像Directx库一样,我们只需要一个方法名,其它的交给硬件处理吧。
尤其是查找。如果可以开发出 处理数组的芯片那么我们的系统性能将提高不止一个数量级。此外我还有一个 关于如何光速搜索的文章,详情请看
http://blog.csdn.net/phker/article/details/3889715
此外是 集合芯片,树芯片,堆栈芯片。。。等等。
最好是能够出现 类似神经元的芯片。