【发布时间】:2014-02-06 05:59:53
【问题描述】:
基本上我有一个伽马探测器系统,每个探测器被分割成 4 个晶体,在只有 2 个晶体记录撞击的情况下,我们可以确定这对是垂直还是平行于产生反应的平面伽马射线。在为此编写逻辑的过程中,我最终编写了一个巨大而丑陋的 switch 语句组合,在每个探测器中检查晶体编号的组合(在整个探测器及其晶体阵列中是唯一的)。 这是代码,包括有问题的函数。
//The Parallel and Perpendicular designations are used in addition to the Double
//designation for the 90 degree detectors if we get a diagonal scatter in those detectors
//then we use the Double designation
enum ScatterType{Single, Double, Triple, Quadruple, Parallel, Perpendicular};
ScatterType EventBuffer::checkDoubleGamma(int det)
{
int num1=evList[crysList[0]].crystalNum;
int num2=evList[crysList[1]].crystalNum;
switch(det)
{
case 10: //first of the 90 degree detectors
if( (num1==40 && num2==41) || //combo 1
(num1==41 && num2==40) || //combo 1 reverse
(num1==42 && num2==43) || //combo 2
(num1==43 && num2==42) )//combo 2 reverse
{ return Parallel; }
else if( (num1==40 && num2==42) || //combo 1
(num1==42 && num2==40) || //combo 1 reverse
(num1==41 && num2==43) || //combo 2
(num1==43 && num2==41) )//combo 2 reverse
{ return Perpendicular; }
else
{ return Double;}
break;
case 11: //second of the 90 degree detectors
if( (num1==44 && num2==45) || //combo 1
(num1==45 && num2==44) || //combo 1 reverse
(num1==46 && num2==47) || //combo 2
(num1==47 && num2==46) )//combo 2 reverse
{ return Parallel; }
else if( (num1==44 && num2==47) || //combo 1
(num1==47 && num2==44) || //combo 1 reverse
(num1==45 && num2==46) || //combo 2
(num1==46 && num2==45) )//combo 2 reverse
{ return Perpendicular; }
else
{ return Double;}
break;
case 13: //third of the 90 degree detectors
if( (num1==52 && num2==53) || //combo 1
(num1==53 && num2==52) || //combo 1 reverse
(num1==54 && num2==55) || //combo 2
(num1==55 && num2==54) )//combo 2 reverse
{ return Parallel; }
else if( (num1==52 && num2==55) || //combo 1
(num1==55 && num2==52) || //combo 1 reverse
(num1==53 && num2==54) || //combo 2
(num1==54 && num2==53) )//combo 2 reverse
{ return Perpendicular; }
else
{ return Double;}
break;
case 14: //fourth of the 90 degree detectors
if( (num1==56 && num2==57) || //combo 1
(num1==57 && num2==56) || //combo 1 reverse
(num1==58 && num2==59) || //combo 2
(num1==59 && num2==58) )//combo 2 reverse
{ return Parallel; }
else if( (num1==56 && num2==59) || //combo 1
(num1==59 && num2==56) || //combo 1 reverse
(num1==57 && num2==58) || //combo 2
(num1==58 && num2==57) )//combo 2 reverse
{ return Perpendicular; }
else
{ return Double;}
break;
default:
throw string("made it to default case in checkDoubleGamma switch statement, something is wrong");
break;
}
}
我知道,由于水晶数字是全局的,而不是每个检测器,我可以取消 switch 语句,并通过 or 语句链接大量条件,基本上将事情减少到 3 个控制路径,一个返回 Parallel ,一个返回 Perpendicular,一个返回 Double,而不是 12 个控制路径,每个控制路径有 4 个。我最初写它是因为它没有思考,老实说,思考它,这种方法减少了布尔语句的平均案例数。
我刚刚研究了如何通过打开evList[crysList[0]].crystalNum 来提高效率,我可以大大减少评估,得到这个:
ScatterType EventBuffer::checkDoubleGamma()
{
int crysNum = crysList[1].crystalNum;
switch(evList[crysList[0]].crystalNum)
{
case 40:
if (crysNum == 41) {return Parallel;}
else if (crysNum == 42) {return Perpendicular;}
else {return Double;}
break;
case 41:
if (crysNum == 40) {return Parallel;}
else if (crysNum == 43) {return Perpendicular;}
else {return Double;}
break;
case 42:
if (crysNum == 43) {return Parallel;}
else if (crysNum == 40) {return Perpendicular;}
else {return Double;}
break;
case 43:
if (crysNum == 42) {return Parallel;}
else if (crysNum == 41) {return Perpendicular;}
else {return Double;}
break;
case 44:
if (crysNum == 45) {return Parallel;}
else if (crysNum == 47) {return Perpendicular;}
else {return Double;}
break;
case 45:
if (crysNum == 44) {return Parallel;}
else if (crysNum == 46) {return Perpendicular;}
else {return Double;}
break;
case 46:
if (crysNum == 47) {return Parallel;}
else if (crysNum == 45) {return Perpendicular;}
else {return Double;}
break;
case 47:
if (crysNum == 46) {return Parallel;}
else if (crysNum == 44) {return Perpendicular;}
else {return Double;}
break;
case 52:
if (crysNum == 53) {return Parallel;}
else if (crysNum == 55) {return Perpendicular;}
else {return Double;}
break;
case 53:
if (crysNum == 52) {return Parallel;}
else if (crysNum == 54) {return Perpendicular;}
else {return Double;}
break;
case 54:
if (crysNum == 55) {return Parallel;}
else if (crysNum == 53) {return Perpendicular;}
else {return Double;}
break;
case 55:
if (crysNum == 54) {return Parallel;}
else if (crysNum == 52) {return Perpendicular;}
else {return Double;}
break;
case 56:
if (crysNum == 57) {return Parallel;}
else if (crysNum == 59) {return Perpendicular;}
else {return Double;}
break;
case 57:
if (crysNum == 56) {return Parallel;}
else if (crysNum == 58) {return Perpendicular;}
else {return Double;}
break;
case 58:
if (crysNum == 59) {return Parallel;}
else if (crysNum == 57) {return Perpendicular;}
else {return Double;}
break;
case 59:
if (crysNum == 58) {return Parallel;}
else if (crysNum == 56) {return Perpendicular;}
else {return Double;}
break;
default:
throw string("made it to default case in checkDoubleGamma switch statement, something is wrong");
break;
}
}
问题仍然存在,有什么技巧可以缩短这个时间吗?更高效?更具可读性?
提前致谢!
【问题讨论】:
标签: c++ if-statement switch-statement