[C] Valore assoluto di un numero + velocemente possibile
Ciao Ragazzi,
sapete dirmi qul'è secondo voi il modo più veloce per ottenere il valore assoluto di un numero siccome lo devo calcolare tante volte? Io pensavo alla seguente funzione: int abs(int x) { return (x > 0) ? x : -x; } che ne dite? |
unsigned int :stordita:
|
Quote:
|
#define ABS(x) ((x) > 0) ? (x) : -(x);
|
Non va bene.
Considera (è in java, ma non cambia): Codice:
class twocompl { Il tuo problema è più accentuato perchè stai lavorando in C, quindi la dimensione dell'int varia da macchina a macchina. Fatti due conti. |
Credo che il più veloce sia questo:
Codice:
unsigned int iabs(int a) |
Quote:
|
Sì che testa :muro:
|
Quote:
Mi sa che la più veloce è la mia... Ho provato con il quadrato al posto del valore assoluto e ho avuto un miglioramento di circa il 25% sulla velocità totale dell'algoritmo. Però dai un modo più veloce ci deve essere :) |
hai provato la macro?
|
Con il quadrato però perdi parte dello spazio degli interi.
|
Ma com'è codificato in bit un numero positivo e uno negativo? Lo avevo fatto alle superiori ma non me lo ricordo più...
|
Quote:
|
Quote:
|
Quote:
|
Ho provato a costruirmi un Look Up Table e sono passato dai 19ms con la mia funzione a 13ms. :)
Peccato però che debba usare quella LUT che è abbastanzza grande. |
Quote:
|
...ovviamente hai effettuato un profiling per verificare incontrovertibilmente che ottimizzando quella funzione otterresti *sensibili* vantaggi in esecuzione spero... :mbe:
Altrimenti hai solo perso tempo sottraendolo alla scrittura di codice utile.... :fagiano: |
Se si tratta di studiare il problema sono d'accordo con TigerShark. E' sempre bene usare un profiling se si tratta di ottimizzare qualcosa.
E prima di ottimizzare con il profiling la maggior parte delle volte e' quasi sempre un problema di modello dati inadeguato. Una volta aggiustato il modello dati la situazione migliora da sola. Comunque non penso che questo caso sia effettivamente migliorabile, mantenendo la leggibilita' e l'universalita', rispetto a quanto ottenibile con la macro. Se invece si tratta di una gara, poiche' sono l'unico ad essere rimasto in ufficio durante la pausa pranzo, e poiche' da solo mi rompo abbastanza, io provo con questo: Codice:
int __inline absasm(int x) Ovviamente e' ben poco universale. Molto poco. Se si prova a compilare con le __inline function si guadagna un 10% rispetto alla versione Macro (che penso sia comunque la preferibile e universale). |
prova così:
Codice:
int abs(int x) |
Tutti gli orari sono GMT +1. Ora sono le: 08:38. |
Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Hardware Upgrade S.r.l.