Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich würde gern die "Länge" von long-Werten ermitteln. Mit Länge meine ich die Anzahl der Dezimalstellen. Gibt es da eine performantere Lösung als den Long in einen String umzuwandeln und dann die Länge zu ermitteln?
DU könntest ganz viele if-else-Abfragen machen (also [c]if (l<10) return 1; else if (l<100) return 2; ...[/c]) oder du castest den long-Wert in ein double und berechnest den 10er-Logarithmus. Keine Ahnung, was am schnellsten ist.
Danke für die vielen und schnellen Antworten! Werte unter Null kommen bei mir nicht vor (sind zeiten). Ich werde mal eine simple messung machen und euch berichten!
Also, für diejenigen, die es interessiert. B4RC0D3 hatte mit seiner einschätzung recht. Die Schleifen-Lösung ist eindeutig am langsamsten (ca. Faktor 2). length() und Logarithmus nehmen sich kaum was (bei meiner messung war length() ein bißchen schneller.
stellen = 0;
long a = 1, b, c;
do {
stellen++;
b = a << 3;
c = a << 1;
a = b+c;
}
while(a <= zahl && a>0);
Ich hab sie mal bei mir getestet und wenn ich mich nicht mit meiner Zeitmessung vertan habe müsste diese Lösung noch schneller sein. (Sogar schneller als wenn man a immer mit 10 multiplizieren würde). In dem anderen Thread stand ja auch dass Dividieren sehr "teuer" ist, daher dieser Ansatz...
Edit:
Falls es jemanden interessiert sind hier die Ergebnisse mit dem TestProgramm aus dem anderen Thread:
Dazu habe ich noch folgende Test-Fälle aufgerufen:
sum += worker.calc(new Long("10000000000000"));
sum += worker.calc(new Long("100000000000000"));
sum += worker.calc(new Long("1000000000000000"));
Kleine Korrektur noch ... if-else bleibt auch bei den longs schneller, allerdings musste ich in dem Test dafür sowas noch anlegen:
Java:
static long a = new Long("10000000000");
static long b = new Long("100000000000");
static long c = new Long("1000000000000");
static long d = new Long("10000000000000");
static long e = new Long("100000000000000");
static long f = new Long("1000000000000000");
static long g = new Long("10000000000000000");
static long h = new Long("100000000000000000");
static long j = new Long("1000000000000000000");
und anschließend if(i < a) etc abfragen... sieht insgesamt hässlich aus, aber scheint die schnellste Lösung zu sein.
@Ark Das (Durchschnitts-)Ergebnis von if-else könnte man bestimmt noch durch "divide & conquer" verbessern, kannst es ja mal ausprobieren
Sowas wie
static long a = new Long("10000000000");
sollte nicht notwendig sein.
static long a = 10000000000L;
sollte gehen (das "L" am Ende ist das wichtige - ansonsten kommt die Meldung "...constant too large", was du vermutlich mit dem "new Long" zu vermeiden versucht hast)