В первый раз цикл Java отстается, почему? [Sun HotSpot 1.5, sparc]

Прежде всего, вы не можете получить доступ к BIOS на виртуальной машине Google Compute Engine. При перезапуске экземпляра вы автоматически отключитесь от сеанса SSH. Как только вы снова откроете другой сеанс SSH, вы уже войдете в ОС.

Android Studio Emulator - это еще одна виртуальная машина, которая эмулирует работу устройства Android. Итак, что вы ищете, так это то, что виртуальная машина вложена в виртуальную машину Google Compute Engine, вы можете обратиться к документации Включение вложенной виртуализации для экземпляров виртуальной машины , чтобы получить дополнительную информацию.

Однако вы можете использовать arm64-v8a или armeabi-v7a ABI. Они довольно медленные, но вы сможете протестировать свои приложения там. Вы можете сделать их быстрее, но это потребует мощной виртуальной машины, которая будет стоить много денег. Чтобы использовать эти изображения в эмуляторе Android Studio:

  1. Перейдите на Tools > AVD Manager.
  2. В левом нижнем углу нажмите + Create Virtual Device ....
  3. В Choose a device definition выберите любое устройство и нажмите Next
  4. В Select a system image перейдите на вкладку Other images
  5. Выберите любой arm64-v8a или armeabi-v7a ABI , (Загрузите, если у вас его нет)
  6. Нажмите Next, дайте имя и нажмите Finish

Запустите виртуальное устройство и дайте ему некоторое время, согласно насколько мощна ваша виртуальная машина, потребуется некоторое время для загрузки. Вы увидите загрузку логотипа Android и через несколько минут вы увидите главный экран. Если это займет слишком много времени, попробуйте перезапустить AVD и Android Studio, а затем подождите некоторое время для загрузки. Это довольно медленно, но работает, я сам проверил.

11
задан Adam Morrison 14 May 2009 в 11:36
поделиться

11 ответов

Какой-то уродливый, нереалистичный код (материал микротестов):

                while (counter < 10000000) {
                        // work
                        for (int j = 0; j < 100; j++)
                                counter++;
                        counter -= 99;
                }

Итак, что это делает и с какой скоростью он должен работать.

Внутренний цикл увеличивает счетчик в 100 раз, затем counter уменьшается на 99. Таким образом, увеличивается на 1. Примечание counter - это переменная-член внешнего класса, поэтому здесь есть некоторые накладные расходы. Затем это выполняется 10 000 000 раз. Таким образом, внутренний цикл выполняется 1 000 000 000 раз.

Цикл, использующий методы доступа, назовите его 25 циклами. 1 000 000 000 раз на 1 ГГц, дает 25 с.

Эй, мы предсказали время МЕДЛЕННОЕ . Медленное время - быстро. Быстрое время наступает после того, как тест был каким-то образом нарушен - 2,5 цикла за итерацию? Используйте -server, и вы можете обнаружить, что это становится еще более глупым.

8
ответ дан 3 December 2019 в 04:53
поделиться

Лучший способ проверить, является ли JIT-компилятор причиной ускорения в последующих итерациях, - это запустить тест с выключенным JIT-компилятором. Для этого укажите системное свойство java.compiler = NONE (слово «none» должно быть в верхнем регистре).

Время, затрачиваемое на загрузку класса, также может привести к тому, что тестируемый код будет работать медленнее первый раз. Наконец, существует недетерминированная задержка между вызовом Thread.start () и вызываемым методом Thread run ().

Возможно, вы захотите найти платформу для тестирования производительности. Хороший фреймворк «разогреет» код, запустив несколько итераций, а затем выполнит несколько таймингов с разным количеством итераций. См. Теория и практика Java: анатомия некорректного микротеста .

3
ответ дан 3 December 2019 в 04:53
поделиться

Добавить загрузку класса как подозреваемого. Классы загружаются лениво по первой ссылке. Так что при первом запуске кода вы, вероятно, впервые обращаетесь к некоторым классам.

3
ответ дан 3 December 2019 в 04:53
поделиться

Интересный вопрос. Я бы подозревал, что это JIT-компилятор, но это мои цифры:

First                | 1  | 2399.233 ms 
Second               | 1  | 2322.359 ms 
Third                | 1  | 2408.342 ms 

Возможно, Solaris делает что-то забавное с потоками; вы пробовали с nThreads = 10 или около того?

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

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

-verbose: class -verbose: jni -verbose: gc - XX: + PrintCompilation

Чтобы точно узнать, где начинается и где заканчивается каждый из вызовов measure (), добавьте инициализации некоторых новых классов между этими методами в качестве маркеров, чтобы -verbose: class отображался в какой момент в логах загружен класс маркера. См. этот ответ для аналогичного измерения.

Чтобы точно узнать, что делает ваш код, я изменил его следующим образом:

public MyBench() {
    try {
        this.nThreads = 1;
        new Mark1();
        measure("First");
        new Mark2();
        measure("Second");
        new Mark3();
        measure("Third");
        new Mark4();
    } catch (Exception e) {
        System.out.println("Error: " + e);
    }
}

private static class Mark1 {
}
private static class Mark2 {
}
private static class Mark3 {
}
private static class Mark4 {
}

Затем, посмотрев, когда JVM загрузила эти классы Mark1 и т. Д., Здесь являются результатами.

Во время первого вызова метода measure () было загружено всего 85 классов, 11 собственных методов были динамически связаны, а 5 методов были скомпилированы JIT:

[Loaded MyBench$Mark1 from file:/D:/DEVEL/Test/classes/]
[Loaded java.net.InetSocketAddress from shared objects file]
[Loaded java.net.InetAddress from shared objects file]
[Loaded MyBench$MyThread from file:/D:/DEVEL/Test/classes/]
[Loaded sun.security.action.GetBooleanAction from shared objects file]
[Dynamic-linking native method java.net.InetAddress.init ... JNI]
[Loaded java.net.InetAddress$Cache from shared objects file]
[Loaded java.lang.Enum from shared objects file]
[Loaded java.net.InetAddress$Cache$Type from shared objects file]
[Loaded java.net.InetAddressImplFactory from shared objects file]
[Dynamic-linking native method java.net.InetAddressImplFactory.isIPv6Supported ... JNI]
 22       MyBench::access$508 (12 bytes)
[Loaded java.net.InetAddressImpl from shared objects file]
[Loaded java.net.Inet4AddressImpl from shared objects file  1%      MyBench$MyThread::run @ 14 (48 bytes)
]
[Loaded sun.net.spi.nameservice.NameService from shared objects file]
[Loaded java.net.InetAddress$1 from shared objects file]
[Loaded java.net.Inet4Address from shared objects file]
[Dynamic-linking native method java.net.Inet4Address.init ... JNI]
[Dynamic-linking native method java.net.PlainSocketImpl.socketCreate ... JNI]
[Dynamic-linking native method java.net.PlainSocketImpl.socketBind ... JNI]
[Dynamic-linking native method java.net.PlainSocketImpl.socketListen ... JNI]
[Loaded java.net.Socket from shared objects file]
[Dynamic-linking native method java.net.PlainSocketImpl.socketAccept ... JNI]
[Loaded java.lang.Integer$IntegerCache from shared objects file]
[Loaded java.util.Formatter from C:\Program Files\Java\jdk1.6.0_11\jre\lib\rt.jar]
[Loaded java.util.regex.Pattern$6 from C:\Program Files\Java\jdk1.6.0_11\jre\lib\rt.jar]
[Loaded java.text.DecimalFormatSymbols from shared objects file]
[Loaded java.util.spi.LocaleServiceProvider from shared objects file]
[Loaded java.text.spi.DecimalFormatSymbolsProvider from shared objects file]
[Loaded sun.util.LocaleServiceProviderPool from shared objects file]
[Loaded java.util.LinkedHashSet from shared objects file]
[Loaded sun.util.LocaleServiceProviderPool$1 from shared objects file]
[Loaded java.util.ServiceLoader from shared objects file]
[Loaded java.util.ServiceLoader$LazyIterator from shared objects file]
[Loaded java.util.ServiceLoader$1 from shared objects file]
[Loaded java.util.HashMap$EntrySet from shared objects file]
[Loaded java.util.LinkedHashMap$LinkedHashIterator from shared objects file]
[Loaded java.util.LinkedHashMap$EntryIterator from shared objects file]
[Loaded sun.misc.Launcher$1 from shared objects file]
 23  !    java.io.BufferedReader::readLine (304 bytes)
[Loaded sun.misc.Launcher$2 from shared objects file]
[Loaded sun.misc.URLClassPath$2 from shared objects file]
[Loaded java.lang.ClassLoader$2 from shared objects file]
[Loaded sun.misc.URLClassPath$1 from shared objects file]
[Loaded java.net.URLClassLoader$3 from shared objects file]
[Loaded sun.misc.CompoundEnumeration from shared objects file]
 24       sun.nio.cs.UTF_8$Decoder::decodeArrayLoop (553 bytes)
[Loaded java.io.FileNotFoundException from shared objects file]
[Loaded java.net.URLClassLoader$3$1 from shared objects file]
[Dynamic-linking native method java.security.AccessController.doPrivileged ... JNI]
[Loaded sun.util.resources.LocaleData from shared objects file]
[Loaded sun.util.resources.LocaleData$1 from shared objects file]
[Loaded java.util.ResourceBundle$Control from shared objects file]
[Loaded sun.util.resources.LocaleData$LocaleDataResourceBundleControl from shared objects file]
[Loaded java.util.Arrays$ArrayList from shared objects file]
[Loaded java.util.Collections$UnmodifiableCollection from shared objects file]
 25       java.lang.String::startsWith (78 bytes)
[Loaded java.util.Collections$UnmodifiableList from shared objects file]
[Loaded java.util.Collections$UnmodifiableRandomAccessList from shared objects file]
[Loaded java.util.ResourceBundle from shared objects file]
[Loaded java.util.ResourceBundle$1 from shared objects file]
[Dynamic-linking native method java.util.ResourceBundle.getClassContext ... JNI]
[Loaded java.util.ResourceBundle$RBClassLoader from shared objects file]
[Loaded java.util.ResourceBundle$RBClassLoader$1 from shared objects file]
[Loaded java.util.ResourceBundle$CacheKey from shared objects file]
[Loaded java.util.ResourceBundle$CacheKeyReference from shared objects file]
[Loaded java.util.ResourceBundle$LoaderReference from shared objects file]
[Loaded java.util.ResourceBundle$SingleFormatControl from shared objects file]
[Loaded sun.util.LocaleDataMetaInfo from shared objects file]
[Loaded java.util.AbstractList$Itr from shared objects file]
[Loaded java.util.ListResourceBundle from shared objects file]
[Loaded sun.text.resources.FormatData from shared objects file]
[Dynamic-linking native method java.lang.Class.isAssignableFrom ... JNI]
[Loaded java.util.ResourceBundle$BundleReference from shared objects file]
[Loaded sun.text.resources.FormatData_fi from C:\Program Files\Java\jdk1.6.0_11\jre\lib\rt.jar]
[Loaded sun.text.resources.FormatData_fi_FI from C:\Program Files\Java\jdk1.6.0_11\jre\lib\rt.jar]
[Loaded java.util.Currency from shared objects file]
[Loaded java.util.Currency$1 from shared objects file]
[Loaded java.util.CurrencyData from shared objects file]
[Loaded sun.reflect.UnsafeFieldAccessorFactory from shared objects file]
[Loaded sun.reflect.UnsafeQualifiedStaticFieldAccessorImpl from shared objects file]
[Loaded sun.reflect.UnsafeQualifiedStaticObjectFieldAccessorImpl from shared objects file]
[Loaded java.util.spi.CurrencyNameProvider from shared objects file]
[Loaded sun.util.resources.OpenListResourceBundle from shared objects file]
[Loaded sun.util.resources.LocaleNamesBundle from shared objects file]
[Loaded sun.util.resources.CurrencyNames from shared objects file]
[Loaded sun.util.resources.CurrencyNames_fi_FI from C:\Program Files\Java\jdk1.6.0_11\jre\lib\rt.jar]
[Loaded java.util.regex.MatchResult from shared objects file]
[Loaded java.util.regex.Matcher from shared objects file]
[Loaded java.util.regex.ASCII from shared objects file]
[Loaded java.util.Formatter$FormatString from C:\Program Files\Java\jdk1.6.0_11\jre\lib\rt.jar]
[Loaded java.util.Formatter$FormatSpecifier from C:\Program Files\Java\jdk1.6.0_11\jre\lib\rt.jar]
[Loaded java.util.Formatter$Flags from C:\Program Files\Java\jdk1.6.0_11\jre\lib\rt.jar]
[Loaded java.util.Formatter$Conversion from C:\Program Files\Java\jdk1.6.0_11\jre\lib\rt.jar]
[Loaded java.util.Formatter$FixedString from C:\Program Files\Java\jdk1.6.0_11\jre\lib\rt.jar]
[Loaded java.util.Formattable from C:\Program Files\Java\jdk1.6.0_11\jre\lib\rt.jar]
[Dynamic-linking native method java.io.FileOutputStream.writeBytes ... JNI]
First                | 1  | [Loaded sun.misc.FormattedFloatingDecimal from C:\Program Files\Java\jdk1.6.0_11\jre\lib\rt.jar]
[Loaded sun.misc.FormattedFloatingDecimal$1 from C:\Program Files\Java\jdk1.6.0_11\jre\lib\rt.jar]
[Loaded sun.misc.FormattedFloatingDecimal$Form from C:\Program Files\Java\jdk1.6.0_11\jre\lib\rt.jar]
[Loaded sun.misc.FormattedFloatingDecimal$2 from C:\Program Files\Java\jdk1.6.0_11\jre\lib\rt.jar]
2072,825 ms 

Во время второго вызова только один метод был скомпилирован JIT:

[Loaded MyBench$Mark2 from file:/D:/DEVEL/Test/classes/]
 26       MyBench$MyThread::run (48 bytes)
Second               | 1  | 2058,669 ms 

Во время третьего вызова дополнительной работы не выполнялось:

[Loaded MyBench$Mark3 from file:/D:/DEVEL/Test/classes/]
Third                | 1  | 2093,659 ms 

Это было выполнено на Windows с jdk1.6.0_11, поэтому ваша система может работать немного по-другому. Например, возможно, что одна из этих привязок динамических методов работает исключительно медленно в вашей системе. Или тогда загрузка всего класса происходит медленнее. Попробуйте посмотреть в журналах, нет ли там необычно долгой паузы или все ли эти операции одинаково медленные.

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

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

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

Я предлагаю вам сделать nThread = Runtime.getRuntime (). AvailableProcessors () Это даст вам оптимальное количество потоков для использования всех ядер в вашей системе.

Вы можете попробовать отключить JIT, чтобы посмотреть, что разница имеет значение.

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

Вы можете заставить виртуальную машину регистрировать информацию о загрузке классов и компиляции, попробуйте следующие аргументы виртуальной машины: -XX: + PrintCompilation -XX: + TraceClassLoading Это может дать некоторые дополнительные подсказки относительно того, что происходит под капотом.

РЕДАКТИРОВАТЬ: Я не уверен, что эти параметры работают в java 1.5 (я использовал их в 1.6). Попробую проверить ... EDIT еще раз: он работает в java 1.5 (обратите внимание, что вам нужен +, а не -, или вы отключите эту опцию ...)

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

Я считаю, что вы также можете использовать нестандартный параметр для java-команду -Xint, чтобы отключить HotSpot и интерпретировать только ваш код. Это могло бы по крайней мере исключить HotSpot из уравнения для интерпретации вашего времени.

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

Это компилятор точки доступа в работе. AFAIK, в первый раз, когда он запускает функцию, запускается «интерпретируемым», и путь выполнения анализируется, тогда JIT-компилятор может оптимизировать последующие вызовы функций.

0
ответ дан 3 December 2019 в 04:53
поделиться

Это, безусловно, компилятор точки доступа. Если вы работаете на 64-битной системе Solaris, по умолчанию используется виртуальная машина сервера, а точка доступа просто запускает оптимизацию при первом запуске. На клиентской виртуальной машине код, возможно, потребуется выполнить несколько раз, прежде чем сработает точка доступа. (Я считаю, что только Solaris имеет виртуальную машину сервера, но я могу ошибаться)

0
ответ дан 3 December 2019 в 04:53
поделиться

См. http://java.sun.com/javase/6/docs/technotes/guides/vm/server-class.html , чтобы узнать, как средство запуска выбирает между клиентские и серверные виртуальные машины, а также то, что поддерживается различными процессорами и ОС.

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

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