Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Destiny Rising: quando un gioco mobile supera il gioco originale
Destiny Rising: quando un gioco mobile supera il gioco originale
Tra il declino di Destiny 2 e la crisi di Bungie, il nuovo titolo mobile sviluppato da NetEase sorprende per profondità e varietà. Rising offre ciò che il live service di Bungie non riesce più a garantire, riportando i giocatori in un universo coerente. Un confronto che mette in luce i limiti tecnici e strategici dello studio di Bellevue
Plaud Note Pro convince per qualità e integrazione, ma l’abbonamento resta un ostacolo
Plaud Note Pro convince per qualità e integrazione, ma l’abbonamento resta un ostacolo
Plaud Note Pro è un registratore digitale elegante e tascabile con app integrata che semplifica trascrizioni e riepiloghi, offre funzioni avanzate come template e note intelligenti, ma resta vincolato a un piano a pagamento per chi ne fa un uso intensivo
Google Pixel 10 è compatto e ha uno zoom 5x a 899€: basta per essere un best-buy?
Google Pixel 10 è compatto e ha uno zoom 5x a 899€: basta per essere un best-buy?
Google Pixel 10 è uno smartphone che unisce una fotocamera molto più versatile rispetto al passato grazie allo zoom ottico 5x, il supporto magnetico Pixelsnap e il nuovo chip Tensor G5. Il dispositivo porta Android 16 e funzionalità AI avanzate come Camera Coach, mantenendo il design caratteristico della serie Pixel con miglioramenti nelle prestazioni e nell'autonomia. In Italia, però, mancano diverse feature peculiari basate sull'AI.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 27-12-2010, 20:06   #1
blackskop
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)
e mi sono detto: "E' leggibile ma non sarebbe più efficiente in questo modo?"

Codice:
B) Math.abs(x - y) == 2
e dopo un nanosecondo l'ho modificata in

Codice:
C) (x - y) * -1 == -2
ma in conclusione ancora non riesco a capire qual è il giusto compromesso tra velocità e leggibilità.

Codice:
             A    B    C
Leggibilità: 3    2    1
Efficienza:  2    1    3
Se le empiriche considerazioni non sono errate, la tabellina mi porterebbe a scegliere la soluzione A ma, dato che non sono poi un microcefalo, pensando anche al famoso detto "in medio stat virtus", ho optato per la soluzione C.

Voi avete qualche altro suggerimento?
blackskop è offline   Rispondi citando il messaggio o parte di esso
Old 27-12-2010, 20:26   #2
Ludo237
Member
 
L'Avatar di Ludo237
 
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
Ludo237 è offline   Rispondi citando il messaggio o parte di esso
Old 27-12-2010, 21:16   #3
Don[ITA]
Senior Member
 
L'Avatar di Don[ITA]
 
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
Don[ITA] è offline   Rispondi citando il messaggio o parte di esso
Old 27-12-2010, 21:42   #4
tuccio`
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]);
	}
	
}
output:
1729179
4147813

Ultima modifica di tuccio` : 27-12-2010 alle 21:51.
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 27-12-2010, 21:48   #5
Supdario
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.
Supdario è offline   Rispondi citando il messaggio o parte di esso
Old 27-12-2010, 21:49   #6
Ludo237
Member
 
L'Avatar di Ludo237
 
Iscritto dal: Feb 2009
Città: Varese
Messaggi: 205
Che FAIL ... non avevo letto il *-1 .. avevo visto *1...
Ludo237 è offline   Rispondi citando il messaggio o parte di esso
Old 27-12-2010, 21:54   #7
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
sarebbe comunque sbagliata :E
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 27-12-2010, 21:58   #8
blackskop
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]);
	}
	
}
2363279
5412704
949930

Ultima modifica di blackskop : 27-12-2010 alle 22:03.
blackskop è offline   Rispondi citando il messaggio o parte di esso
Old 27-12-2010, 22:28   #9
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
e grazie al cazzo, la C fa un controllo in meno tant'è che è sbagliata

che confronto è?
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 27-12-2010, 22:52   #10
Supdario
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.
Supdario è offline   Rispondi citando il messaggio o parte di esso
Old 27-12-2010, 22:53   #11
blackskop
Senior Member
 
Iscritto dal: Aug 2008
Messaggi: 308
Quote:
Originariamente inviato da tuccio` Guarda i messaggi
e grazie al cazzo, la C fa un controllo in meno tant'è che è sbagliata

che confronto è?
Ma guarda che anche se inizializzi la y a -2 i tempi sono gli stessi.

P.s. potresti anche moderare un po' il linguaggio...
blackskop è offline   Rispondi citando il messaggio o parte di esso
Old 27-12-2010, 22:54   #12
blackskop
Senior Member
 
Iscritto dal: Aug 2008
Messaggi: 308
Quote:
Originariamente inviato da Supdario Guarda i messaggi
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.
Si tratta di Java ma il ragionamento dovrebbe prescindere dal linguaggio e da ottimizzazioni specifiche.
blackskop è offline   Rispondi citando il messaggio o parte di esso
Old 27-12-2010, 22:58   #13
Supdario
Member
 
Iscritto dal: Mar 2008
Messaggi: 267
Quote:
Originariamente inviato da blackskop Guarda i messaggi
Si tratta di Java ma il ragionamento dovrebbe prescindere dal linguaggio e da ottimizzazioni specifiche.
Errore mio.
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.
Supdario è offline   Rispondi citando il messaggio o parte di esso
Old 27-12-2010, 23:40   #14
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
Quote:
Originariamente inviato da blackskop Guarda i messaggi
Ma guarda che anche se inizializzi la y a -2 i tempi sono gli stessi.

P.s. potresti anche moderare un po' il linguaggio...
ovviamente, perché in quel caso

questo if
Codice:
if (x - y == 2 || x - y == -2)
fa un solo or, il primo che è true e quindi ritorna senza processare il secondo, perché tanto tutta l'espressione è sicuramente true

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.
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 28-12-2010, 00:00   #15
blackskop
Senior Member
 
Iscritto dal: Aug 2008
Messaggi: 308
Quote:
Originariamente inviato da tuccio` Guarda i messaggi
ovviamente, perché in quel caso

questo if
Codice:
if (x - y == 2 || x - y == -2)
fa un solo or, il primo che è true e quindi ritorna senza processare il secondo, perché tanto tutta l'espressione è sicuramente true

non a caso avevo scelto il caso pessimo

il punto è che il secondo controllo la C non lo fa
No se cambi il valore di inizializzazione della y il controllo lo fa e i tempi non cambiano affatto e sono circa 1/2 del caso A, mentre col valore attuale di y i tempi sono in media 1/3 ma è il caso A che varia!
Comunque a prescindere da questo, c'è un ulteriore modo più efficiente di A e B?
blackskop è offline   Rispondi citando il messaggio o parte di esso
Old 28-12-2010, 00:08   #16
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
Quote:
Originariamente inviato da Supdario Guarda i messaggi
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.
per curiosità ho voluto anche provare in C++, la differenza si è molto assottigliata, ma c'è una cosa abbastanza incredibile che vorrei che qualcuno mi spiegasse

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;
}
l'ho compilato con mingw con il comando

Codice:
g++ -o asd.exe asd.cpp -lm
e l'ho eseguito, l'output è stato:

Codice:
10.686s
13.005s
poi ho detto, va be', proviamo anche con le ottimizzazioni e ho compilato con

Codice:
g++ -o asd.exe asd.cpp -O -lm
risultato:

Codice:
1.833s
1.834s
la domanda è.. che cavolo di ottimizzazione ha fatto? O:
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 28-12-2010, 03:14   #17
Tommo
Senior Member
 
L'Avatar di Tommo
 
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
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 28-12-2010, 11:25   #18
Supdario
Member
 
Iscritto dal: Mar 2008
Messaggi: 267
Quote:
Originariamente inviato da tuccio` Guarda i messaggi
per curiosità ho voluto anche provare in C++, la differenza si è molto assottigliata, ma c'è una cosa abbastanza incredibile che vorrei che qualcuno mi spiegasse

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;
}
l'ho compilato con mingw con il comando

Codice:
g++ -o asd.exe asd.cpp -lm
e l'ho eseguito, l'output è stato:

Codice:
10.686s
13.005s
poi ho detto, va be', proviamo anche con le ottimizzazioni e ho compilato con

Codice:
g++ -o asd.exe asd.cpp -O -lm
risultato:

Codice:
1.833s
1.834s
la domanda è.. che cavolo di ottimizzazione ha fatto? O:
In pratica ha eseguito un'ottimizzazione anche nelle zone limitrofe, ad esempio ha capito che x e y non cambiano mai, ed ha agito di conseguenza, traducendo il codice in questo modo:
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();
Poi ovviamente la traduzione in codice macchina potrebbe aver subito ulteriori ottimizzazioni.
Supdario è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Destiny Rising: quando un gioco mobile supera il gioco originale Destiny Rising: quando un gioco mobile supera il...
Plaud Note Pro convince per qualità e integrazione, ma l’abbonamento resta un ostacolo Plaud Note Pro convince per qualità e int...
Google Pixel 10 è compatto e ha uno zoom 5x a 899€: basta per essere un best-buy? Google Pixel 10 è compatto e ha uno zoom ...
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre Prova GeForce NOW upgrade Blackwell: il cloud ga...
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco Ecovacs Deebot X11 Omnicyclone: niente più...
Interlune creerà un centro di ric...
Stop Killing Games: 97% delle firme conv...
La GTX 2080 Ti mai arrivata sul mercato,...
Hoolow Knight: Silksong, il gioco che a ...
Duolingo crolla in Borsa: la minaccia ar...
Battlefield 6: i giocatori console potra...
Citroen Racing, la marca ritorna alle co...
Windows 10 ESU: come partecipare al prog...
ASUS Vivobook 16X a meno di 470€ su Amaz...
Con Agent Payments Protocol di Google gl...
Windows 10 muore, gli attivisti insorgon...
NVIDIA sarà il primo cliente di T...
Stellantis cancella il pick-up elettrico...
Microsoft termina il supporto per Office...
VaultGemma di Google è il primo L...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 21:25.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v