程式的最佳化
==============

在optimizing_code里已经谈到了一些最佳化的简单注意事项。然而最
佳化并不是少数adm或大巫师的事，而是每一个巫师写程式都必须注意
的事项。因此请大家在完成一个作品时，再花一些时间重看一下程式 
，看看可不可以 藉由一些简单的更改来避免一些不必要的计算，即使 
只是节省一两个计算也是好的。当然也不必为了省一点点的计算而花
很多时间或是把程式写得很复杂。但是一些简单的原则，或是稍微注
意一下，就可能 会有很大的影响。
我们来看一个简单的例子，底下是/adm/daemons/aim_d.c其中的一段 
程式，注意看第七行：

if( random(100) < 30 && !me->query("npc") ) return 0;

本来放在倒数第五行，也就是变成注解的地方。我看到了，就把它移 
到现在的位置。这样有什麽差别呢？如果在原来的位置，中间作了一 
堆关於skill的计算，当此行成立，这些计算都浪费了。而移到第七行 
的位置，当此行成立，就不会去计算skill，只是更改一下程式的位置 
，就可以节省许多不必要的计算。这个程式是医生每回合攻击时都会 
呼叫到，你可以想像原来的写法作了多少不必要的计算。

int aim_target(object me, object victim)
{
	int skill, diffculty;
	string loc;
	object weapon;
	// difficulty for player
	if( random(100) < 30 && !me->query("npc") ) return 0;

	skill = (int)me->query_skill("anatomlogy");
	loc = (string)me->query("aiming_loc");
	if( !skill || !loc ) return 0;
	diffculty = diffs[loc];
	if( undefinedp(diffculty) ) return 0;
	diffculty += diffculty*(int)victim->query("aim_difficulty/"+loc)/100;
   [中间省略]
	skill /= 10;
	skill += (int)me->query_stat("int") * 2 + (int)me->query_stat("kar");
	skill -= (int)victim->query_stat("int") * 2 + (int)victim->query_stat("kar");

//	if( random(100) < 30 && !me->query("npc") ) return 0;

	if( random(skill) < diffculty ) return 0;
	return (int)call_other( this_object(), "hit_" + loc, me, victim );
}

在考虑程式最佳化时，先想想这段程式被使用的频率有多高，如果是 
使用频率很高的程式，那就要多花些心力注意最佳化。一般使用频率 
较高的程式大略是/adm/, /cmds/, /std下的程式，不过这不是一般 
巫师可以动的，另外公会的一些程式，武器的特攻、NPC的tactic，以 
及一些init,relay_message的程式等等。这些都是使用频率很高的程 
式，请大家多花一些心力。

Eastern Story@Yueh	1996/3/2
