Зависимости между различными решателями запуска с z3py - PullRequest
0 голосов
/ 23 апреля 2020

Я провожу пару экспериментов с решателем Z3 (API z3py), где я измеряю качество результатов в зависимости от установленного времени ожидания. Я провожу разные эксперименты из одного и того же vitualenv, но из разных классов. После каждого эксперимента я создаю новый решающий объект, подобный этому:

self.solver = z3.Solver()

У меня такое ощущение, что результаты быстрее обнаруживаются во втором и т. Д. Поэтому мне было интересно, сохраняет ли API-интерфейс z3py некоторые предварительные результаты предыдущих запусков, чтобы ускорить следующий. Если это так, есть ли способ полностью сбросить решатель после запуска.

1 Ответ

0 голосов
/ 23 апреля 2020

Это крайне маловероятно, особенно если учесть, что вы заново создаете солвер Но это невозможно опровергнуть, поскольку вы на самом деле не показали ни одного кода, чтобы увидеть, могут ли быть ошибки.

Я бы рискнул предположить, что, если вы всегда будете наблюдать, как первое решение будет медленнее, чем После этого убедитесь, что вы правильно учли свой интерпретатор Python, чтобы запустить его, загрузить программу, загрузить всю необходимую инфраструктуру z3 и, наконец, вызвать решатель. Обратите внимание, что ничего из этого не будет дешевым, особенно если проблемы, которые вы тестируете, довольно малы.

Хороший способ для go состоит в том, чтобы отбросить временные результаты первых нескольких прогонов, чтобы убедиться, что все строки кэша в памяти прогреты и все выгружено. Затем выполните сравнение прогонов с 3 по 15. Вы все еще видите разницу? Это предполагает наличие других факторов, хотя я сомневаюсь в этом.

Но, опять же, все зависит от того, как вы это закодировали и какие проблемы вы сравниваете. Случайное начальное число, выбранное решающим устройством, может играть роль, но влияние этого должно быть случайным образом распределено, если оно есть.

...