Время выполнения по сравнению со Временем компиляции

Надеюсь, я понимаю вашу проблему. Но из того, что я вижу, вы спрашиваете данные друзей и данные пользователей, когда вы делаете 'SELECT friends, myuser.

Попробуйте только выбрать friends

Примерно так:

SELECT friend FROM AppBundle\Entity\Friends friend INNER JOIN AppBundle\Entity\User user WHERE friend.friendsWithMe = :userId AND friend.status = 1

Тогда в результате у вас будет только массив друзей.

Если проблема не устранена, вы можете добавить fetch = "EAGER", чтобы она не была "LAZY"

* @ORM\ManyToOne(targetEntity="AppBundle\Entity\User", inversedBy="myfriends", fetch="EAGER")

338
задан AstroRP 2 April 2017 в 01:06
поделиться

13 ответов

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

  1. Каким инвариантам удовлетворяет программа?
  2. Что может пойти не так на этой фазе?
  3. Если фаза завершится успешно, каковы постусловия (что мы знаем) ?
  4. Какие входы и выходы, если они есть?

Время компиляции

  1. Программа не обязательно должна удовлетворять каким-либо инвариантам. Фактически, это не нужно это вообще быть хорошо составленная программа. Вы можете передать этот HTML-код компилятору и посмотреть, как он ...
  2. Что может пойти не так во время компиляции:
    • Синтаксические ошибки
    • Ошибки проверки типов
    • (Редко) сбой компилятора
  3. Что мы знаем, если компилятор завершает работу успешно?
    • Программа была правильно сформирована - содержательная программа на любом языке.
    • Можно запустить программу. (Программа может сразу выйти из строя, но мы, по крайней мере, можем попробовать.)
  4. Каковы входы и выходы?
    • Входными данными была компилируемая программа, а также любые файлы заголовков, интерфейсы, библиотеки или другие вуду, которые требовались для импорта , чтобы скомпилировать.
    • Выходные данные - это, надеюсь, код сборки или перемещаемый объект код или даже исполняемая программа. Или, если что-то пойдет не так, на выходе будет набор сообщений об ошибках.

Время выполнения

  1. Мы ничего не знаем об инвариантах программы - это то, что вводит программист. Инварианты времени выполнения редко применяются компилятором в одиночестве; ему нужна помощь программиста.
  2. Что может пойти не так, так это ошибки времени выполнения :

    • Деление на ноль
    • Разыменование нулевого указателя
    • Исчерпание памяти

    Также могут быть ошибки, которые обнаруживает сама программа:

    • Попытка открыть файл, который не t there
    • Попытка найти веб-страницу и обнаружение того, что предполагаемый URL-адрес сформирован неправильно.
  3. Если время выполнения завершается успешно, программа завершает работу (или продолжает работу) без сбоев.
  4. Входные и выходные данные полностью зависят от программист. Файлы, окна на экране, сетевые пакеты, задания, отправленные на принтер, что угодно. Если программа запускает ракеты, это результат, и это происходит только во время выполнения: -)
444
ответ дан 23 November 2019 в 00:39
поделиться

открытый класс RuntimeVsCompileTime {

public static void main(String[] args) {

    //test(new D()); COMPILETIME ERROR
    /**
     * Compiler knows that B is not an instance of A
     */
    test(new B());
}

/**
 * compiler has no hint whether the actual type is A, B or C
 * C c = (C)a; will be checked during runtime
 * @param a
 */
public static void test(A a) {
    C c = (C)a;//RUNTIME ERROR
}

}

class A{

}

class B extends A{

}

class C extends A{

}

class D{

}

0
ответ дан 23 November 2019 в 00:39
поделиться

Можно понять структуру компиляции кода от чтения фактического кода. Структура во время выполнения не четка, если Вы не понимаете шаблон, который использовался.

0
ответ дан 23 November 2019 в 00:39
поделиться

Это плохой вопрос для SO (это не конкретный вопрос программирования), но в целом неплохой вопрос.

Если вы думаете, что это тривиально: как насчет времени чтения или во время компиляции, и когда это полезно различать? А как насчет языков, для которых компилятор доступен во время выполнения? Гай Стил (без пустышки, он же) написал в CLTL2 7 страниц об EVAL-WHEN, которые программисты CL могут использовать для управления этим. Двух предложений едва хватает для определения , которое само по себе далеко от объяснения .

В общем, это сложная проблема, которую разработчики языка, кажется, пытаются избежать. Они часто просто говорят: «Вот компилятор, он делает вещи во время компиляции; все после этого - во время выполнения, получайте удовольствие». C разработан, чтобы быть простым в реализации, а не самой гибкой средой для вычислений. Когда у вас нет компилятора во время выполнения или возможности легко контролировать, когда выражение оценивается, вы, как правило, в конечном итоге используете хаки в языке, чтобы имитировать общее использование макросов, или пользователи придумывают шаблоны проектирования для имитации имея более мощные конструкции. Простой в реализации язык определенно может быть стоящей целью, но это не значит, что это конечная цель проектирования языков программирования. (Я не часто использую EVAL-WHEN, но я не могу представить себе жизнь без него.)

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

К сожалению, я не знаю хороших ссылок на этот счет. CLTL2 немного об этом говорит, но не очень хорошо об этом узнавать.

-1
ответ дан 23 November 2019 в 00:39
поделиться

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

Время компиляции означает, что что-то происходит, когда вы компилируете программу.

2
ответ дан 23 November 2019 в 00:39
поделиться

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

5
ответ дан 23 November 2019 в 00:39
поделиться

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

Время компиляции используется для описания того, что происходит при построении программы (обычно, компилятором).

8
ответ дан 23 November 2019 в 00:39
поделиться

Время компиляции:

Действия, которые выполняются во время компиляции, не требуют (почти) затрат при запуске результирующей программы, но могут повлечь за собой большие затраты при построении программы.

Время выполнения:

Более или менее полная противоположность. Меньше затрат при сборке, дороже при запуске программы.

С другой стороны; Если что-то делается во время компиляции, это выполняется только на вашем компьютере, а если что-то во время выполнения, оно выполняется на вашей пользовательской машине.

Релевантность

Примером того, где это важно, может быть тип, несущий модуль. Версия времени компиляции (например, Boost. Единицы или моя версия в D ) в конечном итоге оказываются столь же быстрыми, как и решение проблемы с собственным кодом с плавающей запятой, в то время как во время выполнения версии приходится упаковывать информацию о единицах, которые значение присутствуют и проводят в них проверки при каждой операции. С другой стороны, версии времени компиляции требуют, чтобы единицы значений были известны во время компиляции, и не может справиться со случаем, когда они поступают из ввода времени выполнения.

8
ответ дан 23 November 2019 в 00:39
поделиться

В основном, если ваш компилятор может определить, что вы имеете в виду или какое значение имеет значение «во время компиляции», он может жестко закодировать это во время выполнения. Очевидно, что если ваш исполняемый код должен выполнять вычисления каждый раз, он будет работать медленнее, поэтому, если вы можете определить что-то во время компиляции, это будет намного лучше.

Например,

Постоянное сворачивание:

Если я напишу:

int i = 2;
i += MY_CONSTANT;

Компилятор может выполнить это вычисление во время компиляции, потому что он знает, что такое 2, и что такое MY_CONSTANT. Таким образом, он избавляет себя от выполнения вычислений при каждом выполнении.

11
ответ дан 23 November 2019 в 00:39
поделиться

Трансляция исходного кода в происходящее на экране [экран | диск | сеть] может происходить (примерно) двумя способами; назовите их компиляцией и интерпретацией.

В скомпилированной программе (примеры - c и fortran):

  1. Исходный код загружается в другую программу (обычно называемую цифрой для компилятора), которая создает исполняемую программу (или ошибку).
  2. Исполняемый файл запускается (двойным щелчком по нему или вводом его имени в командной строке)

Говорят, что то, что происходит на первом этапе, происходит во время "компиляции" ", то, что происходит на втором этапе, называется" во время выполнения ".

В интерпретируемой программе (пример MicroSoft basic (на dos) и python (я думаю)):

  1. Исходный код загружается в другую программу (обычно называемую интерпретатором), которая "
18
ответ дан 23 November 2019 в 00:39
поделиться

Я думаю об этом с точки зрения ошибок и о том, когда они могут быть обнаружены.

Время компиляции:

string my_value = Console.ReadLine();
int i = my_value;

Строковое значение не может быть присвоено переменной типа int, поэтому компилятор точно знает во время компиляции , что этот код имеет проблему

Время выполнения:

string my_value = Console.ReadLine();
int i = int.Parse(my_value);

Здесь результат зависит от того, какая строка была возвращена ReadLine (). Некоторые значения можно преобразовать в int, другие - нет. Это можно определить только во время времени выполнения

163
ответ дан 23 November 2019 в 00:39
поделиться

( edit : следующее применимо к C # и подобным строго типизированным языкам программирования. Я не уверен, поможет ли это вам).

Например, следующая ошибка будет обнаружена компилятором (в время компиляции ) перед запуском программы и приведет к ошибке компиляции:

int i = "string"; --> error at compile-time

С другой стороны, ошибка, подобная следующей, не может быть обнаружена компилятором. Вы получите сообщение об ошибке / исключении во время времени выполнения (при запуске программы).

Hashtable ht = new Hashtable();
ht.Add("key", "string");
// the compiler does not know what is stored in the hashtable
// under the key "key"
int i = (int)ht["key"];  // --> exception at run-time
21
ответ дан 23 November 2019 в 00:39
поделиться

Время компиляции: период времени, в течение которого вы, разработчик,

64
ответ дан 23 November 2019 в 00:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: