|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Aug 2008
Messaggi: 308
|
Divagazione sui massimi sistemi...
Mi sono imbattuto in questa riga di codice
Codice:
A) (x - y == 2 || x - y == -2) Codice:
B) Math.abs(x - y) == 2 Codice:
C) (x - y) * -1 == -2 Codice:
A B C Leggibilità: 3 2 1 Efficienza: 2 1 3 Voi avete qualche altro suggerimento? |
![]() |
![]() |
![]() |
#2 |
Member
Iscritto dal: Feb 2009
Città: Varese
Messaggi: 205
|
Concordo sulla scelta C , della leggibilità me ne frego (faccio i commenti sopra piuttosto) però il codice è molto meglio
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Jul 2006
Città: Bergamo
Messaggi: 401
|
Scusate, ma siete proprio sicuri che C sia equivalente ad A e B?
Se ad esempio: x = 0 y = 2 A) (0 - 2 == 2 || 0 - 2 == -2) -> vero B) Math.abs(0 - 2) == 2 -> vero C) (0 - 2) * -1 == -2 -> falso ![]() O sono solo ubriaco io?? ![]()
__________________
iMac 27" 5K |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
ma infatti la c è sbagliata
e secondo me la b non è più efficiente della a ps: a supporto della tesi Codice:
public class Test { static public void main(String[] args) { long t[] = new long[3]; int x = 0, y = 2; t[0] = System.nanoTime(); for (int i = 0; i < 500000; i++) { if (x - y == 2 || x - y == -2) continue; } t[1] = System.nanoTime(); for (int i = 0; i < 500000; i++) { if (Math.abs(x - y) == 2) continue; } t[2] = System.nanoTime(); System.out.println(t[1] - t[0]); System.out.println(t[2] - t[1]); } } 1729179 4147813 Ultima modifica di tuccio` : 27-12-2010 alle 21:51. |
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: Mar 2008
Messaggi: 267
|
Quoto, l'opzione più veloce è la A, la C mi sembra sbagliata, e se la B magari è più leggibile, è comunque più lenta della A.
|
![]() |
![]() |
![]() |
#6 |
Member
Iscritto dal: Feb 2009
Città: Varese
Messaggi: 205
|
Che FAIL ... non avevo letto il *-1 .. avevo visto *1...
![]() ![]() |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
sarebbe comunque sbagliata :E
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Aug 2008
Messaggi: 308
|
Si la C è sbagliata ma non ho detto che la B è più veloce della A. In teoria la più veloce dovrebbe essere la C, se fosse corretta! Quindi, alternative non ce ne sono?
Codice:
public class Test { static public void main(String[] args) { long t[] = new long[4]; int x = 0, y = 2; t[0] = System.nanoTime(); for (int i = 0; i < 500000; i++) { if (x - y == 2 || x - y == -2) continue; } t[1] = System.nanoTime(); for (int i = 0; i < 500000; i++) { if (Math.abs(x - y) == 2) continue; } t[2] = System.nanoTime(); for (int i = 0; i < 500000; i++) { if ((x - y) * -1 == -2) continue; } t[3] = System.nanoTime(); System.out.println(t[1] - t[0]); System.out.println(t[2] - t[1]); System.out.println(t[3] - t[2]); } } 5412704 949930 Ultima modifica di blackskop : 27-12-2010 alle 22:03. |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
e grazie al cazzo, la C fa un controllo in meno
![]() che confronto è? ![]() |
![]() |
![]() |
![]() |
#10 |
Member
Iscritto dal: Mar 2008
Messaggi: 267
|
In ogni caso non mi sembra il massimo prendere come riferimento il C# per misurare l'ottimizzazione.
![]() |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Aug 2008
Messaggi: 308
|
|
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Aug 2008
Messaggi: 308
|
Quote:
|
|
![]() |
![]() |
![]() |
#13 | |
Member
Iscritto dal: Mar 2008
Messaggi: 267
|
Quote:
![]() Quando si parla di semplici operazioni matematiche è facile capire, ma ad esempio richiamare il metodo Math.Abs in un linguaggio interpretato ha una velocità diversa dal richiamare "abs" in C/C++, ma in questo caso è abbastanza chiaro quale sia il più veloce. |
|
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
Quote:
questo if Codice:
if (x - y == 2 || x - y == -2) non a caso avevo scelto il caso pessimo il punto è che il secondo controllo la C non lo fa Ultima modifica di tuccio` : 27-12-2010 alle 23:43. |
|
![]() |
![]() |
![]() |
#15 | |
Senior Member
Iscritto dal: Aug 2008
Messaggi: 308
|
Quote:
Comunque a prescindere da questo, c'è un ulteriore modo più efficiente di A e B? |
|
![]() |
![]() |
![]() |
#16 | |
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
Quote:
ho scritto questo codice: Codice:
#include <climits> #include <ctime> #include <cmath> #include <iostream> #define N UINT_MAX using namespace std; int main(int argc, char *argv[]) { clock_t t[3]; int x = 0, y = -2; t[0] = clock(); for (unsigned int i = 0; i < N; i++) { if (x - y == 2 || x - y == -2) continue; } t[1] = clock(); for (unsigned int i = 0; i < N; i++) { if (abs(x - y) == 2) continue; } t[2] = clock(); cout << (double)(t[1] - t[0]) / CLOCKS_PER_SEC << "s" << endl; cout << (double)(t[2] - t[1]) / CLOCKS_PER_SEC << "s" << endl; return 0; } Codice:
g++ -o asd.exe asd.cpp -lm Codice:
10.686s 13.005s Codice:
g++ -o asd.exe asd.cpp -O -lm Codice:
1.833s 1.834s |
|
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
La B contiene una chiamata a funzione, che fa cose che non conosci.
Pure assumendo il caso ottimo che il compilatore riesce a realizzare l'inline, è sicuramente l'opzione più lenta. La C invece è sbagliata. Conclusione: meno massimi sistemi e più test dati alla mano ![]() |
![]() |
![]() |
![]() |
#18 | |
Member
Iscritto dal: Mar 2008
Messaggi: 267
|
Quote:
Codice:
int x = 0, y = -2; int tmp = x-y; //Variabile temporanea t[0] = clock(); bool condizione = (tmp == 2 || tmp == -2); for (unsigned int i = 0; i < N; i++) { if (condizione) continue; } t[1] = clock(); condizione = (abs(tmp) == 2); for (unsigned int i = 0; i < N; i++) { if (condizione) continue; } t[2] = clock(); |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:25.