Is this approach less resource intensive?
Ho scritto due semplici bit di C e ho esaminato il disassemblaggio di ciascuno.
#include <stdio.h>
int main(int argc, const char * argv[])
{
char x = argv[1][0] == 't';
char y = argv[1][1] == 't';
int foo;
if(x) {
foo = 50;
} else if (y) {
foo = -50;
} else {
foo = 0;
}
printf("%d",foo);
return 0;
}
e
#include <stdio.h>
int main(int argc, const char * argv[])
{
char x = argv[1][0] == 't';
char y = argv[1][1] == 't';
int foo = ( x - (!x && y) ) * 50;
printf("%d",foo);
return 0;
}
Scusa i miei dissasemblati, sono su un Mac piuttosto che su un Linux Box e quindi non ho un facile accesso a gcc -S
quindi non li incollerò qui. Osservando la sequenza di eventi in ciascuna di esse si trovano le istruzioni if o l'espressione:
Questa sequenza nella prima è:
cmpb je movl jmp cmpb je movl jmp movl jmp leaq movl movb
Lo stesso reigon nella seconda versione è:
movsbl cmpb movl movb jne movsbl cmpl setne movb movb leaq andb movzbl movl subl imull movl movl movb
Il primo è possibile vedere il confronto, saltare uguale, assegnare, saltare alla fine, confrontare, saltare uguale, assegnare, saltare alla fine, assegnare. Nel secondo, c'è una quantità significativa di operazioni in corso. Si può vedere andb
, subl
e imull
che fanno operatori aritmetici.
Il primo farà un piccolo numero di confronti con costanti e rami. Il secondo fa un numero significativo di operazioni.
Is this approach readable to you?
Il primo è di gran lunga più leggibile e mantenibile. Anche se il secondo fosse quello di produrre un codice più ottimale, scriverei ancora il primo perché le frazioni di un secondo che vengono salvate nel codice vengono perse molte volte quando qualcuno torna per mantenere il codice e va in WTF?!
Is assigning values in this way common?
No. Non l'ho mai visto prima di questa situazione.
If 1 is true then in your opinion, does the performance increase
justify the less readable nature of this approach?
Come ho detto, la manutenibilità del codice è fondamentale in ogni situazione in cui qualcun altro possa mai avere la gioia di toccare il tuo codice in seguito.
Come programmatore di Perl, riconosco il valore di hubris:
Hurbis: Excessive pride, the sort of thing Zeus zaps you for. Also the quality
that makes you write (and maintain) programs that other people won't
want to say bad things about. Hence, the third great virtue of a
programmer.
So che direi cose cattive su un programmatore che scrive il secondo, quindi non ho intenzione di farlo.