У меня есть проект, который динамически загружается в неизвестные сборки, реализующие указанный интерфейс. Я не знаю содержания или целей сборки, за исключением того, что она реализует мой интерфейс.
Мне нужно как-то ограничить количество вычислительной мощности, доступной для этих сборок. Приоритет процессора не то, что я ищу. Я не могу использовать секундомер и назначить определенное время для запуска сборки, поскольку сервер может быть произвольно занят.
Оптимально я хотел бы указать некоторые полностью загруженные независимые измерения загрузки процессора. При необходимости я могу запускать сборки в своем собственном процессе.
Есть ли способ как-то измерить общее время использования ЦП данного потока (или процесса, хотя поток будет оптимальным)?
Могу ли я использовать счетчики производительности процесса или они, как я подозреваю, слишком ненадежны? Хотя мне не нужна точность цикла, мне нужна достаточно высокая точность, чтобы ограничить вычислительную мощность, выделяемую для выполнения каждой сборки.
Чтобы немного экстраполировать мою ситуацию. Причина, по которой я не ищу приоритезацию процессов, заключается в том, что я не боюсь исчерпать свои ресурсы, мне просто нужно убедиться, что я могу измерить «сколько» ресурсов использует данная сборка - таким образом, моя точка зрения о том, что сервер произвольно занят.
Представьте пример сценария, в котором у вас есть две сборки X и Y. Каждая из них реализует определенный алгоритм, и я хочу провести примитивный тест, из которого сборка выполняет работу быстрее всего. Я запускаю каждую сборку и позволяю ей работать до тех пор, пока не будут использованы ресурсы "Z", после чего я оцениваю, какая сборка справилась лучше всего. В этом случае я не против, если одна сборка будет работать на 100% ЦП в течение трех секунд, а другая - на 2% ЦП в течение 5 минут - важно общее использование ресурсов.
Я думаю, что смогу использовать перфокартины времени процессора, чтобы сделать грубое ограничение. Запустите каждую сборку в новом потоке и дайте ему поработать, пока не будет использовано определенное количество процессорного времени, после чего я убью процесс и оценим результаты. Я просто боюсь, что это не будет достаточно точно.