構造体の配列: Sample 1: 構造体のメンバーのコピー(C)

高速化プログラミング   
トップ  >  メモリジャンプと高速化  >  構造体の配列  >  Sample 1: 構造体のメンバーのコピー(C)

構造体の配列: Sample 1: 構造体のメンバーのコピー(C)

言語の変更:   FORTRAN版

■ 概要

ここでは構造体のあるメンバーの配列を別の配列にコピーするサンプルを示します。

Code 1は配列の構造体のサンプルです。配列a, b, c, d, e, f, g, hをメンバーとするVectorという構造体を定義します。Vector型のvecを宣言してからそれぞれのメンバーの配列を長さnでメモリの確保をします。メイン計算ではメンバーの配列aを別の配列rにコピーをします。

Code 2は構造体の配列のサンプルです。a, b, c, d, e, f, g, hをメンバーとするVectorという構造体を定義します。Vector型の配列vecを長さnでメモリの確保をします。Code 1と同様にメイン計算ではメンバーの配列aを別の配列rにコピーをします。

配列の長さnとして2,000,000から40,000,000まで20個の値を用いて、Code 1Code 2のメイン計算にかかる時間を測定して出力します。

■ ソースコード

  ◆ Code 1   ◆ Code 2

■ 計算時間の測定結果

Code 1Code 2を実行したときの計算時間をそれぞれ青線と赤線で図1に示します。そして両者の比を緑線で示します。

測定時間
図1 測定時間

■ 考察

Code 1の配列の構造体では配列のメンバーが連続的に配置されているので、構造体のメンバー、配列aにアクセスするときはメモリのジャンプは起こりません(図2を参照)。一方、Code 2の構造体の配列では構造体の同じメンバーは不連続に配列されているので、このサンプルでは図3のようにメモリのジャンプが起こります。

Code 1のときのメモリアクセス
図2 Code 1のときのメモリアクセス
Code 2のときのメモリアクセス
図3 Code 2のときのメモリアクセス

図1の実測ではCode 1Code 2より計算時間が2~3倍速いです。2次元配列のときよりは倍率が低いですが、構造体のメンバーの個数(サイズ)によっては倍率がもっと上がる可能性があります。



はじめに

演算数を減らす

メモリジャンプを減らす

高性能のアルゴリズム

その他



4 8 2 6 3 4