można użyć logartihms obliczyć długość int:
public static int IntLength(int i) {
if (i <= 0) throw new ArgumentOutOfRangeException();
return (int)Math.Floor(Math.Log10(i)) + 1;
}
testy przechodzi:
[Test]
public void TestIntLength() {
Assert.AreEqual(1, IntLength(1));
Assert.AreEqual(1, IntLength(9));
Assert.AreEqual(2, IntLength(10));
Assert.AreEqual(2, IntLength(99));
Assert.AreEqual(3, IntLength(100));
Assert.AreEqual(3, IntLength(999));
Assert.AreEqual(4, IntLength(1000));
Assert.AreEqual(10, IntLength(int.MaxValue));
}
się Szybki test wykazał, że metoda logowania jest 4-krotnie szybsza niż metoda int.ToString(). Długość.
metoda pokazuje GVS poniżej (za pomocą If-deklaracje) jest kolejnym 6 razy szybciej niż metoda log (!):
public static int IntLengthIf(int i) {
if (i < 10) return 1;
if (i < 100) return 2;
if (i < 1000) return 3;
if (i < 10000) return 4;
if (i < 100000) return 5;
if (i < 1000000) return 6;
if (i < 10000000) return 7;
if (i < 100000000) return 8;
if (i < 1000000000) return 9;
throw new ArgumentOutOfRangeException();
}
Oto dokładne czasy dla numerach od 1 do 10.000.000:
IntLengthToString: 4205ms
IntLengthLog10: 1122ms
IntLengthIf: 201ms
Zawsze zrównoważyć bezpłatne mikrosekund próbujesz zyskać na czasie drogiej odczytu złej przyssawką (samodzielnie, chyba), który ma czytać i debuguj ten kod później. – reinierpost
@reinierpost to nie mikro-optymalizacja, jeśli wspomniana metoda jest uruchamiana, jak miliard razy w pętli zwanej przez tysiące różnych wątków. –
Duplikat tego? http://stackoverflow.com/questions/679602/fastest-way-to-calculate-the-decimal-length-of-an-integer-net –