#erlang #profiling
#erlang #профилирование
Вопрос:
Как определить, выполняет ли qlc: q полное сканирование таблицы, сканирование префикса ключа или поиск ключа?
Например, ets типа set с записями типа {{KeyPrefix, KeySuffix}, Value} — будут
qlc:q([
{{KeyPrefix, KeySuffix}, Value} ||
{{KeyPrefix, KeySuffix}, Value} <- ets:table(Table),
KeyPrefix =:= Something
])
выполнять полное сканирование таблицы или сканирование префикса ключа?
Ответ №1:
Вы можете получить много информации о вашем выражении QLC, используя qlc:info/1. Это может не помочь вам определить, использует ли данный подзапрос полное сканирование таблицы или что-то еще, но это вернет вам план запроса и таблицы, связанные с вашим запросом, которые вы затем можете передать в ets: info / 1 для извлечения их типа и ключевых слов.
Ответ №2:
ETS реализован не в Erlang, он реализован в системе выполнения (предположительно, в C?). Как таковой, я не верю, что это возможно сделать сегодня. Даже если вы нашли способ сделать это, ваш метод может сломаться при обновлении до новой версии Erlang. Надежный метод потребовал бы, чтобы система выполнения предоставила какой-либо API самоанализа для работы с ETS, и я думаю, что это вряд ли произойдет, пока это не реализовано в Erlang. Конечно, вы могли бы покопаться в коде, чтобы получить лучшее представление о том, что может произойти в данном сценарии, но я подозреваю, что ваше время было бы лучше потратить, сосредоточившись на коде вашего приложения.
Комментарии:
1. Я не думаю, что этот вопрос специфичен для ETS. Он мог бы предсказуемо реализовать тот же QLC в таблице mnesia или в списке кортежей Erlang, и тот же вопрос все равно был бы применим.
Ответ №3:
По нашему опыту, иногда qlc
оценка (через понимание списка) очень умна, а иногда она очень тупая. То есть, я думаю, что ваш вопрос справедлив.
Я не знаю способа сделать именно то, что вы хотите, но вы можете получить эту информацию другими способами. Вы, конечно, можете посмотреть исходный код qlc
модуля, чтобы увидеть, сможете ли вы извлечь из этого какую-либо информацию. Кроме того, вы могли бы вставить некоторые инструкции отладки внутри qlc
функций и перекомпилировать вашу среду выполнения Erlang, чтобы получить дополнительную обратную связь.
Удачи
-tjw