Происходит ли зацикливание с одинаковой скоростью для всех систем? - PullRequest
3 голосов
/ 04 ноября 2010

Цикл в C # происходит с одинаковой скоростью для всех систем.Если нет, как я могу контролировать скорость зацикливания, чтобы обеспечить совместимость на всех платформах?

Ответы [ 4 ]

9 голосов
/ 04 ноября 2010

Вы можете установить минимальное время, затрачиваемое на обход цикла, например:

for(int i= 0; i < 10; i++)
{
   System.Threading.Thread.Sleep(100);
   ... rest of your code...
}

Спящий вызов займет минимум 100 мс (вы не можете сказать, какой будет максимум)Таким образом, ваш цикл займет не менее 1 секунды, чтобы выполнить 10 итераций.

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

7 голосов
/ 04 ноября 2010

Вы никогда не можете зависеть от скорости цикла. Хотя все существующие компиляторы стремятся сделать циклы настолько эффективными, насколько это возможно, и поэтому они, вероятно, дают очень похожие результаты (при достаточном времени разработки), компиляторы - не единственная мысль, влияющая на это.

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

6 голосов
/ 04 ноября 2010

Нет, циклы не встречаются одинаково во всех системах. На этот вопрос так много факторов, что на него невозможно ответить без кода.

Это простой цикл:

int j;
for(int i = 0; i < 100; i++) {
  j = j + i;
}

этот цикл слишком прост, это просто пара операций загрузки, добавления, сохранения, с переходом и сравнением. Это будет всего несколько микроопераций и будет очень быстрым. Тем не менее, скорость этих микроскопов будет зависеть от процессора. Если процессор может сделать одну микрооперацию за 1 миллиардную долю секунды (примерно один гигагерц), тогда цикл займет примерно 6 * 100 микроопераций (это приблизительная оценка, так много факторов, которые я использую только для приблизительных значений) или 6 * 100 миллиардных долей секунды или чуть меньше одной миллионной доли секунды. Для всего цикла. Вы можете только измерить это с большинством функций операционной системы.

Я хотел продемонстрировать скорость зацикливания. Я упомянул выше процессор с 1 миллиардом микроопы в секунду. Теперь рассмотрим процессор, который может делать 4 миллиарда микроопс в секунду. Этот процессор будет в четыре раза быстрее (примерно), чем первый процессор. И мы не изменили код.

Это отвечает на вопрос?

Для тех, кто хочет упомянуть, что компилятор может циклически развернуть это, игнорируйте это ради обучения.

2 голосов
/ 04 ноября 2010

Одним из способов управления этим является использование Stopwatch для контроля, когда вы выполняете свою логику.См. Пример кода:

int noofrunspersecond = 30;
long ticks1 = 0;
long ticks2 = 0;
double interval = (double)Stopwatch.Frequency / noofrunspersecond;
while (true) {
  ticks2 = Stopwatch.GetTimestamp();
  if (ticks2 >= ticks1 + interval) {
    ticks1 = Stopwatch.GetTimestamp();
    //perform your logic here
  }
  Thread.Sleep(1);
}

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...