随意说点自己算法优化,曾经的SB事情

中山野鬼 发布于 2012/07/08 18:28
阅读 132
收藏 1

说这些,未必能在技术上做参考,而是真好写了“纠结”的BLOG,突然想到,也提醒大家凡是别认真。认真遭雷劈。当然这个认真和老师,领导说的认真不是一会事。你要是偷懒的小朋友,把意思看左了,我相信不会遭雷劈,最多滑到粪坑里。

1、知道总线宝贵,所以希望数据从外部进来,一次处理消化完毕。于是CACHE或TCM 那叫一个挤啊。。代码那叫一个精巧啊。一环扣一环。

事实证明,这样精巧的设计,无论是数据结构还是计算算法,都是比较SB的行为。更本无力调整改动。耦合度太高,而且非常容易忽视,为了存储资源的利用率的上升所带来辅助代码的额外计算量还不谈这些代码的LOADING时间。

实际呢?分步骤分模块,CACHE一次管够,处理完后,memcpy,实际会发生系统DMA的操作,其实不慢。

2、太纠结常量表。总想让他们在TCM里面有自己的位置。忽视了工程中一个概率统计的问题。

事实证明,不是每个表,每个数据的统计访问概率相同。那时的我,很认真,如果这个表局部概率很大怎么办?其实没什么好认真的,更宽的时间窗口下,它的概率还是小的。担忧个毛啊。

实际情况,表尽可能的切割成有独立理论依据的小表,按照概率统计,绝对大概率的表,常驻TCM,其他的随机loading,无所谓。

3、总带着汇编的冲动写C代码。恨不得直接用汇编。

实际呢?除了DSP类的并发指令集,其他手写汇编没有什么必要性,编译器的编译方式是有理论和实际工程参数做依据的。你汇编写死了,比编译器快10%的,估计这逻辑,用C也不会简单到哪里去。能用C写的简单清晰的逻辑,编译器已经做的足够好了。

4、总想用精妙的方式,提升代码质量包括计算速度。

这个SB行为我很早就发现了。其实最快的,还是最简单的算法。不是在比较冒泡和快速排序。而是说,快速排序我们可以有几种实现方式,特别是根据特定数据结构的情况做改良,增加逻辑的耦合度,以降低逻辑的重复描述。

结果呢。更慢。因为忽视了一点,排序的逻辑是固然存在的。自身系统的数据结构也好,函数关联也罢,这些逻辑结构也是存在的,但两者没有关联性,你额外加强逻辑的耦合度,强加上逻辑关联,看似快了,其实这些辅助增加的东西,也会在消耗逻辑实现的成本。

这个有点复杂,举个例子,例如DCT变换,视频里面的DCT全部系数不为0 的其实情况蛮多。针对不同非0系数的分布信息,对DCT进行差异性的计算方法实现,理论上确实做的足够好。其实,这些精细化的分布信息的获取,存储,传递,识别的时间,已经超过了所能省下来的时间。因此最终就只有3种情况,系数只有基频非0,前5个系数非0,其他。

其实,啥是好代码?够简单,够抽象的代码就是好代码。逻辑哗哗长的,基本SB代码。一堆堆的临时变量,一堆堆的精妙逻辑,绝大多数都是狗屁。

这也是为什么我一直对我带的小朋友要求:你的C代码,任何一个变量,你要给我证明它存在的必要性,任何一个语句和逻辑,你要给我证明,他存在的必要性。

有人说我变态,哈,至少我带的小朋友还听我的,我相信会对他C语言的水平有所提升。简洁是种美,好的代码不是靠复杂的逻辑来体现的。所谓”精妙“的代码,通常藏在后面的额外消耗就足以证明它的SB,无非设计者没注意罢了。如我以前一样。

最后总结一下,做人,不能太认真,做代码也不能太认真。简洁是种美。考虑太多是一种SB行为(当然我这里所谓的考虑太多,是因为知道很多事情后,顾前顾后)。另外找喷的说一句,无论什么语言,当你对语言本身仍然处于熟练的状态下,回头看看曾经代码,在不借助说明文档的情况下,不能很快看懂自己当初的设计在干什么,那么不是你有问题,就是你选择的工具有问题。

有些脚本和高级语言,写完了,然后呢?就没有然后了。不妨我骂一句,你这个开发语言工具的人够SB。希望大家不要喷我这个,而是更多关注,“写代码别认真”这个话题。除非你具备评价一门高级语言好坏,针对该缺点优点,可具备重新设计一门高级语言的能力。我也不介意讨论讨论语言自身的设计约束问题。但这是另外一个话题不是我这个帖子的本意。

加载中
0
mallon
mallon
算法哥 优化哥
返回顶部
顶部