“黄沙中,飞舞着我们的先王,他们在空中俯视着子民们对蓝色的向往。” 火之章 霜之章 [最新更新:9月15日]

你在这里看到的是一位.NET程序员的执着及其信仰的效率世界观。我们行走在消逝中,但我们都有希望,都有传承。

设计模式总结:减少循环中的运算 ,2008-10-06,0条评论

经常有这么一种事情:我们常常在循环中做if判断,其实在大多数情况下这个判断是可以通过放到外部,只执行一次就够了,不要小瞧了区区这么点事,当这个函数运行于一个分布式进程或者访问量特别大的网站当中时,能够节省下来的CPU计算量是相当可观的。
代码1:
interface Irun
{
void run();
}
class step1:Irun
{
public void run(){}
}
class step2:Irun
{
public void run(){}


}
//我们设置一个常量,假设只进行100次循环。

Irun ir;
int count = 100;
for(int i = 0;i {
if(true)
{
ir = new step1();
}
else
{
ir = new step2();
}
ir.run();
}

以上这种模式的代码在我们的程序中一定非常多,甚至在for里面还会出现更加复杂的计算,现在我们的目的是尽量节约CPU。看下面的办法:

interface Icreater
{
Irun CrateRuner();
}
interface Irun
{
void run();
}

abstract class step:Irun,Icreater
{
public void run(){}
public abstract Irun CrateRuner();
}


class step1:step
{
public override Irun CrateRuner()
{
return new step1();
}
}

class step2:step
{
public override Irun CrateRuner()
{
return new step2();
}
}

//下面是客户端中的使用算法:

Irun ir;
int count = 100;

if(true)
{
ir = new step1().CrateRuner();
}
else
{
ir = new step2().CrateRuner();
}

for(int i = 0;i {
ir.run(); //现在我们就可以保证在循环中只做最必要的事情了。
}

也许有的朋友要问,直接把if...else拿出循环不就行了吗?
这里请注意一点,class是引用类型,要是那样做的话,实际上我们无论循环多少次,都是仅仅在重复做一件相同的事情。
那么这里又有另一个问题了,既然class是引用类型,那我们把class修改成值类型的struct不行吗?一般来说是不行的。因为这个例子我是为了方便描述问题,才写得如此简单,在实际的生产环境中,很多的结构块是不能用struct来代替class的。因为很多的类之间存在着继承关系,到处充斥着接口和抽象类,这些东西都是struct无法做到的。再有一个就是,我们主要关注的是算法,在不存在冗余设计的前提下能够尽量节约CPU资源就是真理。

mcts

Category

Tag

Archives

  • kvspas
  • Powered by Google App Engine