|
|||||||
|
|
|
![]() |
|
|
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 22: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 23:03. |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
e grazie al cazzo, la C fa un controllo in meno
tant'è che è sbagliatache 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.
Magari con un compilatore C/C++ (e relative impostazioni di ottimizzazione attivate) avrebbe dato risultati diversi. Ma in questo caso sono scontate le opzioni, anche se la C è concettualmente sbagliata.
|
|
|
|
|
|
#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` : 28-12-2010 alle 00: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: 05:47.











tant'è che è sbagliata








