Управление скоростью расчета в программе - PullRequest
3 голосов
/ 24 июля 2010

Один из наших товарищей, Питер Мортенсен , задал вопрос на Super User о приложении, которое может занимать произвольный процент процессорного времени. Это пробудило во мне интерес.

Мой вопрос: как можно подать такое заявление:

Вот некоторые из моих общих идей и почему я считаю их плохими:

  1. Можно создать программу расчета, которая будет использовать алгоритмы, которые будут неэффективными по назначению. Проблема с этой опцией состоит в том, что приложение будет в основном иметь одну передачу. Чтобы решить эту проблему, нам потребуется несколько алгоритмов различной неэффективности, чтобы обеспечить более одной передачи. Тем не менее, пользователь не сможет выбрать, скажем, 50% использования. Ему придется выбрать один из алгоритмов и посмотреть, как он работает на его компьютере.
  2. Приложение может быть создано с использованием рабочего потока, который будет время от времени переводиться в спящий режим. Таким образом, пользователь может контролировать, сколько времени спит поток между каждым выполнением и контролировать загрузку ЦП. Тем не менее, хотя среднее использование может быть управляемым, в один момент поток будет либо спать, либо потреблять ресурсы, так что это не очень хорошее решение.
  3. Это будет вариант номер один. Приложение может быть создано таким образом, чтобы использовать ошибки кэширования или умозрительную компиляцию в Java. Например, может быть создан цикл, который будет контролировать вычисления и заставлять их пропускать кэш с заданным пользователем интервалом. Это замедлит вычисления, но будет трудно реализовать. Или в Java можно использовать JIT-оптимизации. Цикл с условием будет выполняться таким образом, что JIT оптимизирует условие. Как только условие выполнено, JIT должен деоптимизировать код и выполнить его. Но если он хранит как оптимизированные, так и неоптимизированные версии кода, он будет работать только один раз. Кроме того, что-то подобное потребовало бы больших знаний по оптимизации Java, чтобы это работало.

Есть еще идеи, как сделать программу намеренно медленной?

Я прежде всего думал о реализации чего-то подобного в C, C ++, C # или Java, но я боюсь, что C # или Java могут быть слишком высокого уровня для такого рода проблем.

Ответы [ 2 ]

3 голосов
/ 25 июля 2010

Предполагая, что один поток и одно ядро, в любую наносекунду, поток либо делает что-то (100%), либо ожидает (0%).Частичное использование ЦП возможно только как среднее время между работой и неработанием.Таким образом, чтобы получить 50%, просто дайте ему поспать половину времени.Длина сна зависит от вас.

1 голос
/ 24 июля 2010

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

В psuedocode , что-то вроде этого:

while (true)
{
    double cpuUtilization = GetCpuUtilization();
    if (cpuUtilization > 0.5)
    {
        Thread.Sleep(0);
    }
}

Могут быть некоторые оговорки, которые я здесь не учел,но это не в моей голове.Во-первых, вам, вероятно, потребуется запустить цикл в отдельном потоке для каждого ядра ЦП в системе, поэтому в четырехъядерной системе должно быть четыре потока, каждый из которых выполняет вышеуказанный цикл.

...