Насколько хорошо делают молнии на практике, и когда их следует использовать?

Я думаю, что zipper - прекрасная идея; он изящно предоставляет способ для поиска списка или дерева и создания функциональных возможностей локальных обновлений.

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

Являются ли расходы непомерно высокими? И что при каких обстоятельствах было бы разумно использовать молнию?

Ответы

Ответ 1

Я могу предоставить одну твердую точку данных: у нас с Джоном Диасом была бумага в семинаре ML ML 2005 года, где мы сравнили стоимость использования zipper для представления графиков потока управления с затратами на использование изменяемых полей записи в Objective Caml. Мы были очень приятно удивлены, обнаружив, что производительность нашего компилятора с графиками потока управления на основе молнии на самом деле немного лучше, чем производительность, используя традиционную структуру данных с изменяемыми записями, связанными указателями. Мы не смогли найти серьезных инструментов анализа, чтобы точно сказать, почему молния была быстрее, но я подозреваю, что причина в том, что было меньше инвариантов для поддержания и, следовательно, относительно меньше назначений указателей. Также возможно, что оптимизатор был достаточно умен, чтобы амортизировать некоторые из затрат на распределение, вызванные застежкой-молнией. В любом случае застежка-молния может использоваться в оптимизационном компиляторе, и на самом деле есть небольшое преимущество в производительности.