Skip to content

Куди поділась швидкість Java? (день третій)

Ну ось моє перше розчарування в Яві 🙁

Вирішив помірятись піськами швидкостями з іншими мовами: php і Perl.


Накинув простенький код для генерації пароля:

запустив, і зрозумів, що хтось когось наєбав 🙁 …

Швидкість виконання цього скрипта 30-40 сек, причому аналогічний скрипт в php чи perl виконується за долю секунди.

Висновок: вчимо далі Java і удосконалюємось 🙂

Доречі, ось цей самий jar-файл

7 Comments

  1. Ну ти теж хочеш, щоб вставка в стрічку 100000 символів виконувалась за долю секунди. Вузьким місцем є якраз стрічки. Час вставки в стрічку залежить від її розміру. Тобто чим більша стрічка тим довше відбувається вставка.

    В РНР чи Перлі вставка швидша, бо це динамічно типізовані мови, хоча я можу помилятись.

  2. Ура швидкість знайшлася.

    В мене на компі результат від 4 до 6 сотих секунди.
    Проблема була в тому що ти кожен раз примушував джаву приводити різні типи. Math.random() повертає double яке ти потім приводив до int а потім приписував до String.

  3. Коли додавав коментар то в циклі чомусь пропав один мінус після max.

    • відредагував стилі в твоєму коменті. тепер все чотко виглядає)

    • Василь красавчег!
      В когось будуть ще швидші варіанти?)

  4. Мда, Василь жжот 🙂 Дякую за класний приклад!

  5. Андрій Андрій

    Привіт, забагато приведень типу, і у твоєму випадку є інший хороший клас та метод – http://docs.oracle.com/javase/6/docs/api/java/util/Random.html#nextInt%28int%29

    Random.nextInt(9);

    Use Class Random instead of Math

    Math.random() uses Random.nextDouble() internally.

    Random.nextDouble() uses Random.next() twice to generate a double that has approximately uniformly distributed bits in its manitissa, so it is uniformly distributed in the range 0 to 1-(2^-52).

    Random.nextInt(n) uses Random.next() less than twice on average- it uses it once, and if the value obtained is above the highest multiple of n below MAX_INT it tries again, otherwise is returns the value modulo n (this prevents the values above the highest multiple of n below MAX_INT squewing the distribution), so returning a value which is uniformly distributed in the range 0 to n-1.

    Prior to scaling by 6, the output of Math.random() is one of 2^52 possible values drawn from a uniform distribution.

    Scaling by 6 doesn’t alter the number of possible values, and casting to an int then forces these values into one of six ‘buckets’ (0, 1, 2, 3, 45), each bucket corresponding to ranges encompassing either 1501199875790165 or 1501199875790166 of the possible values (as 6 is not a disvisor of 2^52). This means that for a sufficient number of dice rolls (or a die with a sufficiently large number of sides), the die will show itself to be biased towards the larger buckets.

    You will be waiting a very long time rolling dice for this effect to show up.

    Math.random() also requires about twice the processing and is subject to synchronization.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *