我有一个看起来像这样的程序:struct EventTypeA { int someInt; // random between 0 and 9};struct EventTypeB { int someOtherInt; // random between 0 and 100000};int EventAHandler(EventTypeA e) { // Updates multiplier static int multipler = e.someInt; return multiplier;}double EventBHandler(EventTypeB e) { /* This is a simple example for illustration, the actual intermediate calculation takes up much more computational time than this */ int intermediateResult = (e.someOtherInt * multipler) % 10 + 1; if (intermediateResult <= 3) { DoAction1(); } if (intermediateResult >= 7) { DoAction2(); }}......void SomeMethodWithinSomeClass() { while (true) { // Listen for events of type A and B // if EventTypeA occurs, invoke EventAHandler // if EventTypeB occurs, invoke EventBHandler }}我想让EventAHandler每次intermediateResult到达并且有一个新的EventTypeB.someOtherInt时,为所有可能的EventTypeA预先计算multiplier的查找表,因此我可以替换在intermediateResult中进行查找。这样做的理由是我的EventBHandler是时间敏感的,而EventBHandler不是时间敏感的:因此,当EventAHandler稍后到达时,EventTypeB不必执行EventBHandler(假设这条语句占用了一个更多的时钟周期),而只需查找。我的问题是,仅当int intermediateResult = (e.someOtherInt * multipler) % 10 + 1;频繁发生而EventTypeA很少发生时,它才能表现良好。在发生几个连续的EventTypeB的情况下,比我可以预先计算查找表快得多,我想过早地终止预计算并切换回原始方法。有没有一种干净的方法可以做到这一点? (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 您可以选择更新公式来计算中间结果,如下所示:intermediate_result = ((e.someOtherInt) % 10) * multiplier + 1现在,第一个结果将在0-10范围内,并且乘数本身也在相同范围内。现在,您很容易拥有一个10x10的值查找表。尽管使用上面的公式,实际的计算本身并不会是次优的。 (adsbygoogle = window.adsbygoogle || []).push({}); 09-12 18:09