Нетерпеливая загрузка класса Java

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

\w\[\033[00m\]\$

(с завершающим пробелом) - это содержит все трудности, но менее многословно.

Чтобы соответствовать этому, мы должны

  • избежать всех обратных слешей: \w становится \\w и т. Д.
  • escape [ и ], потому что они особенные для sed: [ становится \[, а \[ становится \\\[ (экранированный обратный слеш, экранированный [)
  • [1123 ] escape $: \$ становится \\\$

Затем мы должны использовать одинарные кавычки вокруг нашей команды sed, чтобы оболочка не изменяла строку:

$ sed 's/\\w\\\[\\033\[00m\\\]\\\$ /Replace PS1/' <<< '\w\[\033[00m\]\$ '
Replace PS1

Он также может работать с двойными кавычками, но затем мы должны добавить еще один раунд экранирования для оболочки: \[ становится \\\[ (экранируется для sed) становится \\\\\\[ (сбежал за раковиной) и т. Д.

$ sed "s/\\\\w\\\\\\[\\\\033\\[00m\\\\\\]\\\\\\$ /Replace PS1/" <<< '\w\[\033[00m\]\$ '
Replace PS1

Двойные кавычки имеют смысл, только если вы используете переменные по понятным причинам.

Наконец, для вашей фактической строки:

$ echo '\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' \
    | sed 's/\\\[\\033\[01;32m\\\]\\u@\\h\\\[\\033\[00m\\\]:\\\[\\033\[01;34m\\\]\\w\\\[\\033\[00m\\\]\\\$ /Replace PS1/'
Replace PS1
7
задан Cogsy 1 March 2009 в 10:19
поделиться

6 ответов

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

Некоторые JVMs поддерживают нетерпеливую загрузку, но я не думаю, что JVM Sun делает.

5
ответ дан 6 December 2019 в 11:53
поделиться

Если Вы хотите вынудить классы быть загруженными, делают что-то вроде этого:

public class Main
{
    static
    {
        loadClasses();
    }

    public static void main(final String[] argv)
    {
        // whatever
    }

    private static void loadClasses()
    {
        final String[] classesToLoad;

        // even better, read them from a file and pass the filename to this method
        classesToLoad = new String[]
        {
            "foo.bar.X",
            "foo.bar.Y",
        }

        for(final String className : classesToLoad)
        {
            try
            {
                // load the class
                Class.forName(className);
            }
            catch(final ClassNotFoundException ex)
            {
                // do something that makes sense here
                ex.printStackTrace();
            }
        }
    }
}
5
ответ дан 6 December 2019 в 11:53
поделиться

Правило № 1 для сравнительного тестирования Java: первые 15000 раз (или так) метод выполнения не интересны.

Этот поток содержит некоторый основательный совет: Как я пишу корректный микросравнительный тест в Java?

4
ответ дан 6 December 2019 в 11:53
поделиться

Использовать java -XX:+TraceClassLoading прослеживать загрузку классов.

Использовать java -XX:+PrintCompilation прослеживать, когда методы являются JITed.

2
ответ дан 6 December 2019 в 11:53
поделиться

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

1
ответ дан 6 December 2019 в 11:53
поделиться

Нет стандартного параметра командной строки, так как это не часть спецификации JVM. Ленивая загрузка класса (явно позволена как) часть спецификации JVM. Было бы возможно использовать Class.forName() перед выполнением для загрузки классов, о которых Вы знаете, но это не является автоматически переходным.

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

0
ответ дан 6 December 2019 в 11:53
поделиться
Другие вопросы по тегам:

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