Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR ha finalmente lanciato il suo nuovo flagship: Magic 8 Pro. Lo abbiamo provato a fondo in queste settimane e ve lo raccontiamo nella nostra recensione completa. HONOR rimane fedele alle linee della versione precedente, aggiungendo però un nuovo tasto dedicato all'AI. Ma è al suo interno che c'è la vera rivoluzione grazie al nuovo Snapdragon 8 Elite Gen 5 e alla nuova MagicOS 10
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Le webcam Insta360 Link 2 Pro e Link 2C Pro sono una proposta di fascia alta per chi cerca qualità 4K e tracciamento automatico del soggetto senza ricorrere a configurazioni complesse. Entrambi i modelli condividono sensore, ottiche e funzionalità audio avanzate, differenziandosi per il sistema di tracciamento: gimbal a due assi sul modello Link 2 Pro, soluzione digitale sul 2C Pro
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70 porta il concetto di smartphone ultrasottile su un terreno più concreto e accessibile: abbina uno spessore sotto i 6 mm a una batteria di capacità relativamente elevata, un display pOLED da 6,7 pollici e un comparto fotografico triplo da 50 MP. Non punta ai record di potenza, ma si configura come alternativa più pragmatica rispetto ai modelli sottili più costosi di Samsung e Apple
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 27-12-2010, 21: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, 21: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, 22: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, 22: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 22:51.
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 27-12-2010, 22: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, 22: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, 22: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, 22: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 23:03.
blackskop è offline   Rispondi citando il messaggio o parte di esso
Old 27-12-2010, 23: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, 23: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, 23: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, 23: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, 23: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 28-12-2010, 00: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` : 28-12-2010 alle 00:43.
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 28-12-2010, 01: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, 01: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, 04: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, 12: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


HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione HONOR Magic 8 Pro: ecco il primo TOP del 2026! L...
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata Insta360 Link 2 Pro e 2C Pro: le webcam 4K che t...
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza Motorola edge 70: lo smartphone ultrasottile che...
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026 Display, mini PC, periferiche e networking: le n...
Le novità ASUS per il 2026 nel settore dei PC desktop Le novità ASUS per il 2026 nel settore de...
Gigabyte: un handheld? Sì, ma sol...
Samsung conferma l'arrivo di tre variant...
Sottile, veloce e con un'ottima autonomi...
Il top di gamma compatto di OnePlus &egr...
Modificare l'indirizzo Gmail è finalment...
Perché le GeForce RTX con pi&ugra...
Più tempo online non equivale a più disa...
Amazon Weekend: iPhone 17 Pro, robot asp...
TV OLED 65'' top di gamma al 50%: 144Hz,...
Londra si prepara al terremoto 'intellig...
Scope elettriche in offerta su Amazon: f...
iPhone 17 Pro a un nuovo minimo storico ...
DJI Mini 4 Pro Fly More Combo a 859€ su ...
Roborock in offerta su Amazon: QV 35A e ...
Crisi della RAM: Intel rassicura sul mer...
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: 08:18.


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