Доброго времени суток!
Ну не мог я пройти мимо тестирования 1С executer и oscript — https://youtu.be/A1CedCgm1eA
Из документации 1С:
Язык «1С:Исполнителя» строго типизирован. У каждой переменной, параметра и метода, возвращающих значения, должны быть заданы типы или перечисление возможных типов через вертикальную черту «|» – нельзя передать переменную непредусмотренного типа.
И что мы имеем в Исполнителе с Массивом?
Новый Массив()
А в java на технологиях которого работает он:
ArrayList<Boolean>
Время работы исполнителя 216 сек, время oscript 97 сек, а jvm меньше 1 сек.
Для сравнения приведем что там реально на Диком Западе в динамической типизации?
Python3 27 сек
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
import datetime n = 50000000; array = [] array.insert(0, 0) array.insert(1, 0) i = 2 while i <= n: array.insert(i, 1) i += 1 print("Begin-"); timeBegin = datetime.datetime.now() i = 2; while i <= n: if array[i] == 1: sq = i * i; if sq <= n: m = sq while m <= n: array[m] = 0 m += i i += 1 timeEnd = datetime.datetime.now(); diff = (timeEnd - timeBegin).seconds; print("End-") print(diff) |
PHP7 19 сек
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<?php //$n = 50000000 ini_set("memory_limit", -1); $n = 50000000; $array = array(); $array[0] = 0; $array[1] = 0; for($i = 2; $i <= $n; $i++){ $array[$i] = 1; } print("Begin-"); $timeBegin = new DateTime('now'); $i = 2; while ( $i <= $n ) { if( $array[$i] === 1) { $sq = $i * $i; if($sq <= $n) { $m = $sq; while ($m <= $n) { $array[$m] = 0; $m += $i; } } } $i += 1; } $timeEnd = new DateTime('now'); $diff = $timeEnd->getTimestamp() - $timeBegin->getTimestamp(); print("End-".$diff) ?> |
И вне конкурса — статическая типизация
JAVA меньше секунды
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
import java.util.ArrayList; import java.time.LocalDateTime; import java.time.ZoneOffset; public class Main { public static void main(String[] args) { int n = 50000000; ArrayList<Boolean> array = new ArrayList<Boolean>(); array.add(false); array.add(false); long i = 2; while( i <= n ){ array.add(true); i += 1; } System.out.print("Start-"); LocalDateTime timeBegin = LocalDateTime.now(); i = 2; while ( i <= n ) { if( array.get((int)i) ){ long sq = i * i; if (sq <= n) { int m = (int)sq; while (m <= n) { array.set(m, false); m += i; } } } i += 1; } LocalDateTime timeEnd = LocalDateTime.now(); long diff = timeEnd.toEpochSecond(ZoneOffset.UTC) - timeBegin.toEpochSecond(ZoneOffset.UTC); System.out.print("End-"); System.out.print(diff); } } |