post Image
99%くらいのSwiftプログラマーが使わないであろう演算子の話

概要

Swiftには、オーバーフロー演算(&+, &-, &*)と呼ばれる演算がある。
オーバーフロー演算を使用することで、オーバーフローの判定とエラー処理が行わずに演算を行うことができる。
その結果として、通常の演算と比べ、高速に演算を実行することができる。

背景

整数同士の加減算、乗算を行う場合、オーバーフローが発生する時がある。
例えば16bit符号なし整数同士の加算であれば65535 + 1を計算しようとしたとする。

  0b1111111111111111
+ 0b0000000000000001
=0b10000000000000000

正しい演算結果は、65536であるが、これを表現するためには、17bit必要となる。
だが、CPUでの演算結果は、16bit符号なし整数で表されるため、下位16bitの0b0000000000000000が使われる。
このような最上位桁より上の存在しない桁への繰り上がりをオーバーフロー(算術オーバーフロー)と呼ぶ。
減算の場合には、存在しない桁からの繰り下げもあり、こちらも、同じくオーバーフローと呼ぶ。

Swiftでは、以下のような文をコンパイルしても、エラーとなる。

let willOverflow: UInt16 = UInt16.max + 1

この時のエラーは以下のようになる。

Arithmetic operation '65535 + 1' (on type 'UInt16') results in an overflow

このようなオーバーフローに対し、エラーを起こすことで、演算結果が不正な値となることを防ぐことができる。

オーバーフロー演算

オーバーフローが発生しないように、アルゴリズムの設計時に、適切なbit幅を選択しなければならない。
慎重に設計を行なった結果、通常、整数の演算で行われるオーバーフローのチェックとエラー処理が不要である、と判断されたとする。
このような場合、プログラマーの責任において、オーバーフロー発生時にエラーを発生させず、単に演算結果の型のbit幅に合わせて下位bitのみを使用するようにしたい。
そのような時に、使用する演算子がSwiftでは利用可能である。

演算子 演算
&+ 加算
&- 減算
&* 乗算

これらの演算は、通常の演算子と同様に使用する。

let willOverflow: UInt16 = UInt16.max + 1

ただし、これらの演算は、オーバーフローが発生した場合には、不正な結果となるので、使用する場合は注意が必要である。

実験

オーバーフロー演算を使用した場合、オーバーフローが発生したかどうかのチェックが行われないため、演算速度に影響があると考えられる。
ここでは、適当な型の演算を繰り返し行なった場合の演算時間の比較を行う。

今回は、単純に、任意の数を10億回加算を行うという処理を使って、実行時間の比較を行った。
それぞれ、以下のようなプログラムである。

func computeWwithOrdinalOperator(_ number: Int) {
    var result: Int = 0
    for _ in 0..<1_000_000_000 {
        result = result + number
    }
}
func computeWwithOverflowOperator(_ number: Int) { 
    var result: Int = 0
    for _ in 0..<1_000_000_000 {
        result = result &+ number
    }
}

また、コンパイル時には、-Ononeを指定し、最適が行われないようにしている。

プログラムの違いは、加算を一般的な+を使用したものとオーバーフロー演算&+を使用している点のみである。

このプログラムに適当なnumberを与え実行した時の実行結果を以下に示す。

試行 +の実行時間 [s] &+の実行時間 [s]
#1 10.676 8.678
#2 10.575 8.521
#3 10.589 8.432
#4 10.553 8.428
#5 10.658 8.461

実験結果より、オーバーフロー演算を使用することで、実行時間が高速になることが示された。
今回の実験では、2割程度、プログラムの実行が高速となることがわかる。


『 Swift 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。