У меня есть проект, который динамически загружается в неизвестные сборки, реализующие указанный интерфейс. Я не знаю содержание или цели сборки, кроме реализации моего интерфейса.Предельное выполнение сборки число циклов процессора
Мне нужно как-то ограничить объем вычислительной мощности, доступный для этих сборок. Приоритет процессора - это не то, что я ищу. Я не могу использовать секундомер и назначать определенное количество времени для сборки, поскольку сервер может быть произвольно занят.
Оптимально я хотел бы указать некоторую полностью независимую от нагрузки степень использования ЦП. При необходимости я могу запускать сборки в их собственном процессе.
Есть ли способ каким-либо образом измерить общее использование ЦП за определенный период времени (или процесс, хотя поток был бы оптимальным)?
Могу ли я использовать счетчики производительности процесса, или они, как я подозреваю, слишком ненадежны? Хотя мне не нужна точность цикла, мне понадобится довольно высокая точность, чтобы ограничить вычислительную мощность, выделяемую для каждого выполнения сборки.
Чтобы немного экстраполировать мою ситуацию. Причина, по которой я не ищу приоритет процессов, заключается в том, что я не боюсь исчерпать свои ресурсы, мне просто нужно убедиться, что я могу измерить «сколько» ресурсов, которые использует данная сборка, поэтому моя точка зрения о том, что сервер произвольно занятый.
Представьте пример сценария, в котором у вас есть две сборки X и Y. Каждый из них реализует данный алгоритм, и я хочу сделать примитивный тест, из которого сборка быстрее выполняется. Я запускаю каждую сборку и запускаю ее до тех пор, пока не будут использованы ресурсы «Z», после чего я оцениваю, какая сборка выполнила наилучшую работу. В этом случае я не против, если одна сборка работает на 100% CPU в течение трех секунд, в то время как другая работает на 2% CPU в течение 5 минут - это важно для общего использования ресурсов.
Я думаю, что, возможно, я смогу использовать перфекционист процессора, чтобы сделать грубое ограничение. Проведите каждую сборку в новом потоке и позвольте ей запуститься до тех пор, пока она не будет использовать заданное количество процессорного времени, после чего я убью процесс и оцениваю результаты. Я просто боюсь, что это будет недостаточно точно.
Являются ли сборки, которые вы загружаете, будут порождаться дочерними процессами? – jmcd 2008-10-24 19:21:47
Нет, детские сборки не будут порождать дочерние процессы. В общем случае дочерние процессы будут запускать очень простой код (сильно ограниченный с использованием CAS). – 2008-10-26 00:57:48