Ho codice hotspot che viene eseguito in un loop stretto:Evitare ripetizioni/loop unswitching
for (i = 0; i < big; i++)
{
if (condition1) {
do1();
} else if (condition2) {
do2();
} else {
do3();
}
// Shared code goes here
// More shared code goes here
}
Dal condition1
e condition2
sono invarianti, io non commutata il ciclo per
if (condition1) {
for (i = 0; i < big; i++)
{
do1();
// Shared code goes here
// More shared code goes here
}
} else if (condition 2) {
for (i = 0; i < big; i++)
{
do2();
// Shared code goes here
// More shared code goes here
}
} else {
for (i = 0; i < big; i++)
{
do3();
// Shared code goes here
// More shared code goes here
}
}
Questo funziona molto meglio, ma mi chiedo se c'è un modo intelligente per farlo senza ripetermi?
Forse potresti utilizzare un puntatore a funzione. Impostalo in base alle condizioni, quindi utilizzalo all'interno di un singolo ciclo. –
Le condizioni1 e le condizioni2 sono note al momento della compilazione? – Straw1239
@ Straw1239: No, possono differire ogni volta che viene chiamata la funzione. – Charles