2015-01-21 3 views
3

Я знаю, что разделение объявления пакета на несколько строк создает неявный импорт. Так что это:Имеет ли несколько объявлений `package` медленный компилятор?

package com.me.project 
package module 

Равно:

package com.me.project.module 
import com.me.project._ 

Однако, если объект в project пакета изменен, будет ли это вызвать sbt перекомпилировать текущий файл, или же, что зависит от того, изменились объект действительно вызывается в текущей области? В принципе, я задаюсь вопросом, является ли быть более явным, например:

package com.me.project.module 
import com.me.project.UtilClass 
import com.me.project.Rng 

бы ускорить время компиляции против любой из первых двух подходов?

+2

Я очень сомневаюсь, что это создало бы заметную разницу, но я думаю, что единственный способ убедиться в этом - это фактически сравнить его. – lmm

ответ

1

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

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

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

Я не говорю, что это единственное возможное поведение, потому что оно может быть реализовано каким-либо образом, но реализует компилятор таким образом, что он вызывает перекомпиляцию вашего кода, когда код, соответствующий декларации импорта изменения не имеют большого смысла, когда вы думаете об этом, поэтому он очень уверен, что он этого не сделает. Потому что, что будет? Каждые исходные файлы, вероятно, содержат декларацию пакета и некоторые импорты. Если ваш код перекомпилируется, потому что одно из объявлений в диапазоне подстановочных импортов изменяет, то это должно произойти и для всех других файлов. И поскольку вы можете быть уверены, что в каждом приложении все существующие импорты охватывают более или менее весь путь к классам, весь путь к классам необходимо перекомпилировать только потому, что один файл изменился, что не является желаемым поведением.

+1

Ну, я думаю, важно понять, на какой части вопроса вы отвечаете. Потому что использование * специфического * import (как подсказывает в конце вопроса) делает * массивную * разницу в времени компиляции, если есть неявное, которое будет помещено в область с глобальным импортом ... относительно многострочного пакета vs явный импорт '._', да, действительно, это должно быть одинаково. –

+0

Ну да, если импорт подстановочных знаков фактически импортирует больше, чем ожидает пользователь в том, что импортируется, это имеет значение. – sschaef

+0

Да, просто чтобы быть ясным - меня интересует разница между «явным и точным» импортом против «имплицитного и высокоуровневого» импорта. Я обновлю вопрос – Mathew

Смежные вопросы