Прежде всего, вы не можете получить доступ к BIOS на виртуальной машине Google Compute Engine. При перезапуске экземпляра вы автоматически отключитесь от сеанса SSH. Как только вы снова откроете другой сеанс SSH, вы уже войдете в ОС.
Android Studio Emulator - это еще одна виртуальная машина, которая эмулирует работу устройства Android. Итак, что вы ищете, так это то, что виртуальная машина вложена в виртуальную машину Google Compute Engine, вы можете обратиться к документации Включение вложенной виртуализации для экземпляров виртуальной машины , чтобы получить дополнительную информацию.
Однако вы можете использовать arm64-v8a или armeabi-v7a ABI. Они довольно медленные, но вы сможете протестировать свои приложения там. Вы можете сделать их быстрее, но это потребует мощной виртуальной машины, которая будет стоить много денег. Чтобы использовать эти изображения в эмуляторе Android Studio:
Tools > AVD Manager
. + Create Virtual Device ...
. Choose a device definition
выберите любое устройство и нажмите Next
Select a system image
перейдите на вкладку Other images
arm64-v8a
или armeabi-v7a
ABI , (Загрузите, если у вас его нет) Next
, дайте имя и нажмите Finish
Запустите виртуальное устройство и дайте ему некоторое время, согласно насколько мощна ваша виртуальная машина, потребуется некоторое время для загрузки. Вы увидите загрузку логотипа Android и через несколько минут вы увидите главный экран. Если это займет слишком много времени, попробуйте перезапустить AVD и Android Studio, а затем подождите некоторое время для загрузки. Это довольно медленно, но работает, я сам проверил.
Какой-то уродливый, нереалистичный код (материал микротестов):
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, и вы можете обнаружить, что это становится еще более глупым.
Лучший способ проверить, является ли JIT-компилятор причиной ускорения в последующих итерациях, - это запустить тест с выключенным JIT-компилятором. Для этого укажите системное свойство java.compiler = NONE
(слово «none» должно быть в верхнем регистре).
Время, затрачиваемое на загрузку класса, также может привести к тому, что тестируемый код будет работать медленнее первый раз. Наконец, существует недетерминированная задержка между вызовом Thread.start () и вызываемым методом Thread run ().
Возможно, вы захотите найти платформу для тестирования производительности. Хороший фреймворк «разогреет» код, запустив несколько итераций, а затем выполнит несколько таймингов с разным количеством итераций. См. Теория и практика Java: анатомия некорректного микротеста .
Добавить загрузку класса как подозреваемого. Классы загружаются лениво по первой ссылке. Так что при первом запуске кода вы, вероятно, впервые обращаетесь к некоторым классам.
Интересный вопрос. Я бы подозревал, что это JIT-компилятор, но это мои цифры:
First | 1 | 2399.233 ms Second | 1 | 2322.359 ms Third | 1 | 2408.342 ms
Возможно, Solaris делает что-то забавное с потоками; вы пробовали с nThreads = 10
или около того?
Вероятно, это загрузка классов или динамическое связывание собственных методов. Если вы запустите 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, поэтому ваша система может работать немного по-другому. Например, возможно, что одна из этих привязок динамических методов работает исключительно медленно в вашей системе. Или тогда загрузка всего класса происходит медленнее. Попробуйте посмотреть в журналах, нет ли там необычно долгой паузы или все ли эти операции одинаково медленные.
так что ваша система может делать что-то немного иначе. Например, возможно, что одна из этих привязок динамических методов работает исключительно медленно в вашей системе. Или тогда загрузка всего класса происходит медленнее. Попробуйте посмотреть в журналах, нет ли там необычно долгой паузы или все ли эти операции одинаково медленные. так что ваша система может делать что-то немного иначе. Например, возможно, что одна из этих привязок динамических методов работает исключительно медленно в вашей системе. Или тогда загрузка всего класса происходит медленнее. Попробуйте посмотреть в журналах, нет ли там необычно долгой паузы или все ли эти операции одинаково медленные.Я предлагаю вам сделать nThread = Runtime.getRuntime (). AvailableProcessors () Это даст вам оптимальное количество потоков для использования всех ядер в вашей системе.
Вы можете попробовать отключить JIT, чтобы посмотреть, что разница имеет значение.
Вы можете заставить виртуальную машину регистрировать информацию о загрузке классов и компиляции, попробуйте следующие аргументы виртуальной машины: -XX: + PrintCompilation -XX: + TraceClassLoading Это может дать некоторые дополнительные подсказки относительно того, что происходит под капотом.
РЕДАКТИРОВАТЬ: Я не уверен, что эти параметры работают в java 1.5 (я использовал их в 1.6). Попробую проверить ... EDIT еще раз: он работает в java 1.5 (обратите внимание, что вам нужен +, а не -, или вы отключите эту опцию ...)
Я считаю, что вы также можете использовать нестандартный параметр для java-команду -Xint, чтобы отключить HotSpot и интерпретировать только ваш код. Это могло бы по крайней мере исключить HotSpot из уравнения для интерпретации вашего времени.
Это компилятор точки доступа в работе. AFAIK, в первый раз, когда он запускает функцию, запускается «интерпретируемым», и путь выполнения анализируется, тогда JIT-компилятор может оптимизировать последующие вызовы функций.
Это, безусловно, компилятор точки доступа. Если вы работаете на 64-битной системе Solaris, по умолчанию используется виртуальная машина сервера, а точка доступа просто запускает оптимизацию при первом запуске. На клиентской виртуальной машине код, возможно, потребуется выполнить несколько раз, прежде чем сработает точка доступа. (Я считаю, что только Solaris имеет виртуальную машину сервера, но я могу ошибаться)
См. http://java.sun.com/javase/6/docs/technotes/guides/vm/server-class.html , чтобы узнать, как средство запуска выбирает между клиентские и серверные виртуальные машины, а также то, что поддерживается различными процессорами и ОС.