2014-10-31 8 views
6

Я написал функцию управления списком как на F #, так и Scala для сравнения производительности. Чтобы проверить эту функцию мне нужно инициализировать список от 1 до 100000000.Scala vs F # on List range от 1 до 100000000

F #:

let l = [1..100000000];; 

Real: 00: 00: 32,954, CPU: 00: 00: 34,593, GC gen0: 1030 , gen1: 520, gen2: 9

Это работает.

Скала: вариант Скала -J-Xmx2G

val l = (1 to 10000000).toList // works 

val l = (1 to 100000000).toList // no response long while and finally got java.lang.OutOfMemoryError: Java heap space 

С 100000000 (100,000,000), отсутствие ответа на долгое время (в час) с 75% до 90% загрузки процессора и памяти 2 Гб и, наконец, получил java.lang.OutOfMemoryError: пространство кучи Java.

Я делаю что-то не так в Scala?

+0

Вы пытаетесь увеличить количество экземпляров этой страницы? Возможно, когда вы создаете процесс сбора сборщика мусора и используете 90% вашего процессора. – krynio

+0

Существует множество накладных расходов в scala 'List' за столько элементов. Вы ничего не делаете неправильно; это просто много размещения объектов. Единственная коллекция, которую я могу построить такого размера в разумные сроки, кажется, представляет собой массив. – Nate

+0

Является ли размер кучи F # аналогичным образом ограниченным 2 ГБ? Сам список, предполагающий 8 байтовых целых чисел и 8 байтовых указателей, занимает не менее 1,6 Гбайт памяти кучи. – lea

ответ

5

Обратите внимание, что val l = (1 to 100000000).toList создает новый List с содержимым из оригинального Range(1 to 100000000), следовательно, шанс на дефицит в кучного пространстве, а также тяжелых срабатываний сборщика мусора. Увеличьте -J-Xmx как предлагалось @krynio.

Однако, не изменяя размер кучи, рассмотрите использование итераторов, особенно если тест производительности основан на последовательной итерации по списку; например

(1 to 100000000).iterator 
res0: Iterator[Int] = non-empty iterator 
+0

Спасибо @enzyme. Фактически, я использовал '-J-Xmx2G' для вышеуказанного случая. И функция манипулирования списком зависит от функции заголовка и хвоста List, в частности оператора '+:' prepend. –