Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

史上最速のAndroid

1,580 views

Published on

DroidKaigi2016の発表資料です

Published in: Technology
  • Be the first to comment

史上最速のAndroid

  1. 1. 2
  2. 2. 3 「Androidの仮想マシン Dalvik編」発売中!
  3. 3. 「Androidの仮想マシン ART編」は必ず出します!
  4. 4. 注意! ARTのコードが頻繁に変わるので 将来的に正しい保証はありません
  5. 5. • https://www.genymotion.com/ • x86/Androidエミュレータ • Android 6.0 GenyMotion • Intel core i5 6400T (Skylake) • メモリ32GB PC環境
  6. 6. • DEXファイル解析 • バイトコードレベルの解析 • 今回は使いません dexdump • OATファイル解析 • コンパイルされたバイトコード、ネイティブコードの解析 • 今回はこっちを使います oatdump
  7. 7. int N = 100000000; int ret = 0; for (int i = 0; i < N; ++i) { ret += i; }
  8. 8. int ret = 0; for (int i = 0; i < N; i += 8) { ret += i; ret += i; ret += i; ret += i; ret += i; ret += i; ret += i; ret += i; }
  9. 9. 1: int net.remoteplace.myapplication.Test.test1() DEX CODE: 0x0000: 1400 00e1 f505 | const v0, #+100000000 0x0003: 1202 | const/4 v2, #+0 0x0004: 1201 | const/4 v1, #+0 0x0005: 3501 0600 | if-ge v1, v0, +6 0x0007: b012 | add-int/2addr v2, v1 0x0008: d801 0101 | add-int/lit8 v1, v1, #+1 0x000a: 28fb | goto -5 0x000b: 0f02 | return v2
  10. 10. art/compiler/dex/quick/mir_to_lir.cc case Instruction::IF_EQ: case Instruction::IF_NE: case Instruction::IF_LT: case Instruction::IF_GE: case Instruction::IF_GT: case Instruction::IF_LE: { if (mir_graph_->IsBackEdge(bb, bb->taken) || mir_graph_->IsBackEdge(bb, bb->fall_through)) { GenSuspendTest(opt_flags); } LIR* taken = &label_list[bb->taken]; GenCompareAndBranch(opcode, rl_src[0], rl_src[1], taken); break; }
  11. 11. インタープリタのソースを読むと 実行速度のイメージが沸きます!
  12. 12. クラス名 メソッド名 java/lang/Class classForName getDeclaredMethodInternal getDeclaredConstructorInternal getDeclaredMethodsUnchecked getDeclaredConstructorsInternal getNameNative getDeclaredFieldInternal getProxyInterfaces getDeclaredFields getPublicDeclaredFields getDeclaredFieldsUnchecked newInstance java/lang/Object internalClone notifyAll notify wait java/lang/reflect/Array createMultiArray createObjectArray java/lang/reflect/Constructor newInstance java/lang/reflect/Field get set getBoolean setBoolean getByte setByte getChar setChar getDouble setDouble getFloat setFloat getInt setInt getLong setLong getShort setShort java/lang/reflect/Method invoke getExceptionTypesNative
  13. 13. クラス名 メソッド名 java/lang/StringFactory newStringFromBytes newStringFromString newStringFromChars java/lang/System arraycopy arraycopyLongUnchecked arraycopyCharUnchecked arraycopyFloatUnchecked arraycopyByteUnchecked arraycopyDoubleUnchecked arraycopyShortUnchecked arraycopyBooleanUnchecked arraycopyIntUnchecked identityHashCode java/lang/Throwable nativeFillInStackTrace nativeGetStackTrace libcore/util/CharsetUtils asciiBytesToChars toIsoLatin1Bytes isoLatin1BytesToChars toUtf8Bytes toAsciiBytes sun/misc/Unsafe compareAndSwapInt putInt compareAndSwapLong putOrderedInt compareAndSwapObject getLong getIntVolatile putLong putIntVolatile putOrderedLong getLongVolatile getObject putLongVolatile putObject getObjectVolatile putOrderedObject putObjectVolatile getArrayBaseOffsetForComponentType getInt getArrayIndexScaleForComponentType
  14. 14. JNINativeMethod m = {“hoge", “!()Z", hoge}; env->RegisterNatives(clazz, &m, 1);
  15. 15. 注意! 最速を目指す必要などない!
  16. 16. 質問はありますか!?

×