kuinka kauan kestää, että PC laskee biljoonaan
Tämä on kysymys, joka tuli kollegan kanssa käydyn keskustelun jälkeen jostain yli 20 biljoonan dollarin arvoisesta yrityksestä – ja emme vain voineet kuvitella, kuinka paljon rahaa näyttäisi käteisenä. Vain saada käsitys siitä laskimme, kuinka monta sataa dollaria seteleitä se kestäisi kiertää maapallon kerran-vastaus oli uskoakseni noin 240.000.000 eli noin 24 miljardia dollaria. Se on paljon rahaa. Kuinka paljon ihmisen pitäisi laskea niin paljon rahaa? Kukaan ei voi sanoa varmasti.
mutta voimme tehdä aika hyvän kuvan siitä, kuinka paljon tietokoneen pitäisi laskea jopa biljoonaan. Yksinkertaisesti iteroida, ei muuta toimintaa välillä. Siitä olen kirjoittanut yksinkertainen pala koodia, joka mittaa, kuinka paljon se vie laskea jopa miljoona ja sitten tekee joitakin yksinkertaisia matematiikkaa arvioida, kuinka paljon se veisi laskea jopa eri arvoja ja sitten näyttää tulokset ystävällisellä tavalla käyttäen menetelmää kohteliaisuus StackOverflow.
tulokset ovat mielenkiintoisia. Ja vastaus on:: se riippuu koneestasi. Jopa samalla koneella saat erilaisia tuloksia riippuen kuormituksesta. Mutta katsotaan vähän miinaa:
- miljardiin (9 Nollaa) ollaan saavuttamassa nopeasti – 15 sekuntia
- mutta päästä biljoonaan (12 Nollaa) – ero on hämmästyttävä – 4 tuntia ja 10 minuuttia. Periaatteessa 1000 kertaa enemmän.
- erot muuttuvat vieläkin vaikuttavammiksi, kun nousemme kvadrillionsiin (15 Nollaa), joka veisi 173 päivää, ja sitten quintillionsiin (18 Nollaa), joka veisi 475 vuotta
- viimeinen, jolle tein laskelman, on yksi sekstillion (21 nollaa) ja valmistautuminen – tarvittaisiin läppäriltäni tasan 7708 vuotta, 292 päivää, 6 tuntia, 43 minuuttia ja 52 sekuntia iteroida tuohon arvoon.
kuten olen sanonut – nämä arvot riippuvat paljon koneesta. Joten voit kokeilla sitä itse ja ehkä jakaa tulokset. Koodi alla:
static void Main(string args){ var startTimestamp = DateTime.Now; for (int i = 0; i <= 1000000; i++); var elapsedTime = DateTime.Now - startTimestamp; Console.WriteLine(string.Format("{0} for 1 billion (9 zeros),", GetReadableString(new TimeSpan(elapsedTime.Ticks * 1000)))); Console.WriteLine(string.Format("{0} for 1 trillion (12 zeros)", GetReadableString(new TimeSpan(elapsedTime.Ticks * 1000000)))); Console.WriteLine(string.Format("{0} for 1 quadrillion (15 zeros)", GetReadableString(new TimeSpan(elapsedTime.Ticks * 1000000000)))); Console.WriteLine(string.Format("{0} for 1 quintillion (18 zeros)", GetReadableString(new TimeSpan(elapsedTime.Ticks * 1000000000000)))); Console.WriteLine(string.Format("and {0} for it to count up to 1 sextillion (21 zeros).", GetReadableString(new TimeSpan(elapsedTime.Ticks * 1000000000000000)))); Console.ReadKey();} private static string GetReadableString(TimeSpan span){ string formatted = string.Format("{0}{1}{2}{3}{4}", span.Duration().Days > 364 ? string.Format("{0:0} year{1}, ", span.Days / 365, span.Days == 365 ? string.Empty : "s") : string.Empty, span.Duration().Days > 0 ? string.Format("{0:0} day{1}, ", span.Days % 365, span.Days % 365 == 1 ? String.Empty : "s") : string.Empty, span.Duration().Hours > 0 ? string.Format("{0:0} hour{1}, ", span.Hours, span.Hours == 1 ? String.Empty : "s") : string.Empty, span.Duration().Minutes > 0 ? string.Format("{0:0} minute{1}, ", span.Minutes, span.Minutes == 1 ? String.Empty : "s") : string.Empty, span.Duration().Seconds > 0 ? string.Format("{0:0} second{1}", span.Seconds, span.Seconds == 1 ? String.Empty : "s") : string.Empty); if (formatted.EndsWith(", ")) formatted = formatted.Substring(0, formatted.Length - 2); if (string.IsNullOrEmpty(formatted)) formatted = "0 seconds"; return formatted;}
miten olisi iterointi kaikkien Guidien kautta?
sitten, insinöörin todellisessa hengessä, vaihdoin toiseen aiheeseen – täysin liittyvään (minulle) – guidien ainutlaatuisuuteen. Olin aiemmin kysynyt itseltäni, kuinka ainutlaatuinen GUID oikeastaan on. Sain vastaukseni silloin, mutta nyt se on vielä selvempi.
aloitus-GUIDit esitetään yleensä 32 heksadesimaalilukuna – eli 10 numeroa enemmän kuin yksi kuustiljoona. Sitten taas, jokainen numeroa GUID voi olla arvoja 0 – F (16 arvot) verrattuna normaaliin kokonaisluku, joka sallii vain 0-9 (eli 10 arvot). Ja missä edellisessä esimerkissä laskimme vain yhteen, tässä mennään F: ään
, joten jos minun matematiikkani on oikein, otamme ajan kuustiljoonasta (7708 vuotta) – kerrotaan se 10.000.000.000: lla (kymmenen Nollaa), sitten 1.6: lla – on 1.6 enemmän arvoja jokaiselle numerolle – ja sitten 16: lla (F).
se on noin 1.973.248.000.000.000 vuotta – eli 1.973.248 miljoonaa vuosituhatta. Sen verran veisi läppäriltäni, että pystyisi toistamaan kaikki mahdolliset Guidin arvot. Kuinka ainutlaatuista se on?