質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

860閲覧

Swiftのジェネリクス関数のコンパイルと実高速度に関して

h_crane

総合スコア171

コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/02/17 16:28

ジェネリクス関数のコンパイルに関して

「ジェネリクス」の場合と「普通に型を縛った」場合で、関数の実行速度に差があるかに関して質問です。
(前提として、playgroundのようなJIT環境ではなく、コンパイル(AOT)されたアプリで実行している想定)
(アプリのビルド時間には影響があるのはわかっています。関数の実行速度にフォーカスしています)

ある

  • 「ジェネリクス」の場合
  • 「普通に型を縛った」場合

の関数を例に取れば、以下

ex

// ① func hoge<T>(huga: T) { print(huga) } // ② func hoge(huga: String) { print(huga) }

①は呼び出し元で何をセットするかで型が決まるかと思いますが、
いずれもhoge(huga: "txt")で実行可能です。

hoge(huga: "txt")とそれぞれ書いた場合、呼び元の関数は違いますが、
実際コンパイルされる際に型が決まると思うので、中間コード?ネイティブコード?では決められた形になると思っています。

つまり、アプリ内で読み込まれるネイティブコードは同じなので、実行速度も同じになると考えているですが、どうなんでしょうか?
(上記は、関数内の処理がが早すぎて実際実行時間に差異は出ないかと思いますが、もっと処理が重い場合などで)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Swift のコード生成には詳しくありませんが、Generics in SwiftImplementation Model に vtable を使った動的ディスパッチになると書いてあるので、多少のオーバーヘッドがある可能性はありますが、ほとんど気にしなくて良いレベルだと思います。
また、次の Specialization では specialization(特定の型専用のコードを生成すること)やインライン化にも触れられているので、「普通に型を縛った」場合と同じコードとなる可能性もありますね。

投稿2020/02/17 21:26

hoshi-takanori

総合スコア7895

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

h_crane

2020/02/18 17:50

ドキュメントまでお探しいただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問