史上最速のAndroid

1,052
-1

Published on

DroidKaigi2016の発表資料です。

Published in: Technology
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,052
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
1
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide
  • 他の登壇者が自己紹介見るとすごい人ばかり何ですが、自分はただのおっさんです。
    仕事Android全然関係ありません。
  • 史上最速の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. obj.val = 0; for (int i = 0; i < N; i += 8) { obj.val += i; obj.val += i; obj.val += i; obj.val += i; obj.val += i; obj.val += i; obj.val += i; obj.val += i; }
    12. 12. Too Looooong! なんでこんなに 冗長になるの!?
    13. 13. inline T* Object::GetFieldObject(MemberOffset field_offset) { uint8_t* raw_addr = reinterpret_cast<uint8_t*>(this) + field_offset.Int32Value(); HeapReference<T>* objref_addr = reinterpret_cast<HeapReference<T>*>(raw_addr); T* result = ReadBarrier::Barrier<T, kReadBarrierOption>( this, field_offset, objref_addr); return result; }
    14. 14. ルート スキャン • ルートオブジェクト (ローカル変数など) にマーク • Stop The World (アプリケーション停止) 並行マーキング • マークされたオブジェクトの参照先をマーク • ここは並行処理 再マーキング • マーク漏れを再スキャン • Stop The World(アプリケーション停止) スイープ • マークされていないオブジェクトを削除
    15. 15. インタープリタのソースを読むと 実行速度のイメージが沸きます!
    16. 16. クラス名 メソッド名 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
    17. 17. クラス名 メソッド名 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
    18. 18. JNINativeMethod m = {“hoge", “!()Z", hoge}; env->RegisterNatives(clazz, &m, 1);
    19. 19. 注意! 最速を目指す必要などない!
    20. 20. 質問はありますか!?

    ×