2015年11月9日

ベンチマーク2 localとglobal

ローカル変数へのアクセスと、グローバル変数へのアクセスについて、ベンチマークを計測します。
計測は、①変数の読み込み ②変数への書き込み の2種類について行います


まずは、①変数の読み込み を行うベンチマークのソースコードです。

from benchmarker import Benchmarker

global_valiable = 0

with Benchmarker(10000000, cycle=3, extra=1) as bench:

    @bench("local")
    def _(bm):
        local_valiable = 0
        for _ in bm:
            dummy = local_valiable

    @bench("global")
    def _(bm):
        for _ in bm:
            dummy = global_valiable
計測結果です。
## benchmarker:         release 4.0.1 (for python)
## python version:      3.4.0
## python compiler:     MSC v.1600 32 bit (Intel)
## python platform:     Windows-8-6.2.9200
...

## Ranking      real
local         1.5814  (100.0) ********************
global        2.1379  ( 74.0) ***************
ローカル変数へのアクセスの方が高速のようです。



続いて、②変数への書き込み を行うベンチマークのソースコードです。

from benchmarker import Benchmarker

global_valiable = 0

with Benchmarker(10000000, cycle=3, extra=1) as bench:

    @bench("local")
    def _(bm):
        local_valiable = 0
        for _ in bm:
            local_valiable = 10

    @bench("global")
    def _(bm):
        global global_valiable
        for _ in bm:
            global_valiable = 10
計測結果です。
## benchmarker:         release 4.0.1 (for python)
## python version:      3.4.0
## python compiler:     MSC v.1600 32 bit (Intel)
## python platform:     Windows-8-6.2.9200
...

## Ranking      real
local         1.5978  (100.0) ********************
global        2.0992  ( 76.1) ***************
こちらも、ローカル変数へのアクセスの方が高速のようです。




2つの計測結果から得られる結論は 「ローカル変数へのアクセスの方が、グローバル変数へのアクセスよりも高速である」 とであると言えます。

グローバル変数を変更することは、処理速度以前の問題として、可能な限り排除すべきです。
他方、定数のグローバル変数というのはマジカルナンバーを定義するためによく使われると思います。仮にこのベンチマークのように、何万回もグローバル変数を読み込むのであれば、いったんローカル変数にコピーする、などの工夫があっても良いかと思います。

0 件のコメント:

コメントを投稿