в то время как (а == б); против пока (а == б) {;}

Есть ли разница между следующими фрагментами кода:

  1. while (a==b);
  2. while (a==b) {;}

Влияет ли это на компилятор или время выполнения?

Предпосылки для этого вопроса: В настоящее время FW использует код 1, где a или b на самом деле является глобальной переменной, и FW зависает/ожидает в определенном ядре, пока условие не станет истинным другим ядром. Мы хотели бы имитировать этот код в SystemC, и этот «бесконечный» цикл while не находится в контексте SystemC, и поэтому планировщик SystemC не будет знать, что этот поток ожидает другого, что приведет к взаимоблокировке.

Поэтому мы хотим заменить код на: while (a==b) {CONTEXT_SWITCH(1);}

где для целевой сборки у нас есть:

#define CONTEXT_SWITCH(x)

и для сборки systemC у нас есть:

#define CONTEXT_SWITCH(x)   wait(x) //where wait is a systemC wait

Этот код в случае целевой сборки становится кодом 2. Хотел узнать, может ли это как-то повлиять на производительность?


person subtle85    schedule 11.05.2013    source источник
comment
Почему while (a==b) {;}, а не только while (a==b) {}? Вы можете попробовать последнее, если первое окажется слишком медленным :) А если серьезно, то разницы нет. Оказывает ли это влияние (если ваш компилятор ведет себя как-то по-другому) - можете сказать только вы.   -  person AnT    schedule 11.05.2013


Ответы (4)


Влияет ли это на компилятор или время выполнения?

Нет. Это точно то же самое. Во время выполнения разницы не будет, а разница во времени компиляции незначительна для синтаксического анализа {;}.

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

person Andy Prowl    schedule 11.05.2013
comment
Я бы всегда предпочитал {;} просто ; так как один выглядит как случайность, когда у вас бесконечный цикл, и вы не знаете, почему, а другой выглядит как намерение. - person SinisterMJ; 11.05.2013
comment
Спасибо за быстрые ответы! - person subtle85; 11.05.2013
comment
@subtle85: Рад, что смог помочь. Если это отвечает на ваш вопрос, рассмотрите возможность пометить ответ как принятый (или любой другой ответ разных пользователей, который вы можете предпочесть). - person Andy Prowl; 11.05.2013

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

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

person Alok Save    schedule 11.05.2013
comment
Даже самый глупый и наивно реализованный компилятор в мире должен генерировать одну и ту же сборку для двух конструкций, они синтаксически и семантически идентичны. - person This isn't my real name; 12.05.2013

Нет, это никак не должно влиять на производительность.

Фигурные скобки не генерируют код как таковой. Компилятор использует их для определения начала и конца составного оператора и больше ничего. Для компилятора составной или одиночный оператор обрабатывается одинаково — фигурные скобки нужны только для того, чтобы компилятор знал, что вы хотите использовать в качестве оператора для цикла while.

person Mats Petersson    schedule 11.05.2013

Оба будут иметь одинаковое время выполнения, когда мы напишем while(a==b); Компилятор внутренне преобразует его в while(a==b){;}. Так что неважно, в какой форме вы это написали.

person reshma    schedule 11.05.2013