2015-09-16 3 views
4

В OCaml memory.h или alloc.h не используется realloc (byterun/caml). Означает ли это, что невозможно перераспределить блок OCaml GC (или значение)? Потребительная случае я имею в виду это строка CONCAT, где можно сделать следующие оптимизированы с помощью перераспределить:Могу ли я повторно выполнить блок GC OCaml?

a = a^b 

В моих тестах, строка CONCAT на самом деле быстрее в PHP (5.5), чем нативный скомпилированные OCaml (4,02 0,1).

Редактировать: В другом тесте, Bufferявляется гораздо быстрее, чем PHP CONCAT, и еще быстрее, чем OCaml Concat даже при преобразовании буфера строки в каждой итерации цикла. Code.

+1

Это не отвечает на ваш конкретный вопрос, но если вы выполняете множество конкатенаций строк, обычно рекомендуется использовать модуль «Буфер» из стандартной библиотеки. – Virgile

+0

@Virgile Привет! Да, это намного быстрее я обнаружил. –

ответ

3

Это правда, что нет realloc()-примитив примитива для памяти OCaml.

КПД realloc() не является данным; это зависит от схемы вызовов. Вообще говоря, это только экономит время, если после перераспределенного объекта есть свободное пространство.

В OCaml это маловероятно; в младшем генерации GC никакие объекты не имеют свободного пространства после них; блоки распределяются при уменьшении порядка памяти. В старшем поколении у вас может быть странное отверстие здесь и там. Если уплотнение было сделано недавно, только один старый объект в конце может иметь свободное пространство после него.

По этим причинам я подозреваю, что realloc() практически не имеет преимуществ в среде OCaml GC.

Я бы на самом деле склонялся к сомнению, что realloc() - причина, по которой вы получаете больше времени для PHP, чем для OCaml. Я не думаю, что это настоящая временная пауза, за исключением необычных обстоятельств. Но, возможно, у вас есть некоторые измерения, которые поддерживают эту теорию.

Update

Вы можете поэкспериментировать с модулем OCaml Buffer, который позволит вам конкатенации строк императивно. Буфер, вероятно, будет быстрее, чем использование оператора ^ для многих случаев (но имеет обычные недостатки изменчивого значения).

+0

Эй, спасибо за ответ. Я буду анализировать коды операций PHP, чтобы увидеть, что происходит, вернется. –

+0

(Также вы можете попробовать модуль OCaml 'Buffer', см. Обновление.) –

+0

Спасибо, я тестировал, и это намного быстрее. К каким минусам вы относитесь? На уровне компилятора или концептуальном уровне? –