組み込みデータ型とちょっとした疑問に関する実験
今回は組み込みデータ型に関して
組み込みデータ型は大きく分けて「数値」「文字列」「真理値」「object」の4種類。もう少し詳細にはMicrosoftの下記サイトを参照してもらうのが確実だけど、大まかに理解する分には問題ないと思う。
この中で32bitの整数と64bitの整数に関してですが、これらは32bitアプリ/64bitアプリとしてアプリケーションを開発した時にパフォーマンスにどの程度効果が出てくるのか前々から疑問に思っていました。ただ確かめないといけないような状況に陥ったこともなかったので試したことがないのですが。
まぁ、でも、いつまでも「もやもや」しているのも気分が悪いので、ついでにDecimalも加えて同じ計算をさせた場合のCPU使用率を測定することで試してみました。結果は以下の通り*1。
ソリューション構成:Release - CPU Any: 計75337ms
UInt64 < UInt32 (+2%) < Double (+23.3%) < Float (+5.3%) < Decimal (+11.6%)
ソリューション構成:Release - x64: 計39884ms
UInt64 < UInt32 (+0.17%) < Double (+2.8%) < Float (+0.0%) < Decimal (+82.8%)
ソリューション構成:Debug - CPU Any: 計116437ms
UInt64 < UInt32 (+1.4%)< Double (+12.0%) < Float (+4.5%) < Decimal (+26.8%)
ソリューション構成:Debug- x64: 計66377ms
Double < UInt64 (+0.0%) < Float (+0.1%) < UInt32 (+0.0%) < Decimal (+58.4%)
結論としては、整数は64bitOSで使う限りはUInt64の方が若干UInt32よりも性能が良い。しかし、大きな違いはないので、メモリの使用量を考えると整数はあまり気にせずUInt32を使っていて問題はないケースがほとんどと思われる。
それ以外に関しては、FloatとDoubleに関してはRelease-x64で扱う限り性能差は考慮に入れる必要はないが、CPU Anyでコンパイルすると劇的に*2遅くなるようなので取り扱い注意。しかし、Decimalは逆にRelease - x64でコンパイルして実行するとなぜかかなり*3遅くなる。原因は不明ながら*4、浮動小数点数値とDecimalは混在させずに使い分けるのがよさそうだ…
プリプロセッサ ディレクティブ
普段コーディングではコンパイルシンボルくらいしか使っていないけれど、調べてみるとこれまた色々種類があって新しい発見が。具体的には以下の6種類で、特にVisualStudioを使っている身としては#region ~ #endregionがコメント代わりに使いやすくてよさそうな気がします。
あと、最後の条件付きメソッドは#ifdef DEBUG~#endifが複雑になりやすいのをすっきり記述できるので、これも積極的に採用するべきかな。
- #define / #if / #else / #elif / #endif*1
- #error / #warning*2
- #line*3
- #pragma*4
- #region / #endregion*5
- 条件付きメソッド
#region~#endregionを用いたコメントの例
ステートメントに関して
今回はステートメントに関して調べてみました。
こちらも普段何気なく使っていますが、実は結構な種類があり見ていくと面白いかもと思っていたのですが、C#でもunsafeを使うことでポインタが使える*1とか驚きました。
以下にステートメントの種類を記載します。
- 宣言ステートメント
- 式ステートメント
- 選択ステートメント
- 繰り返しステートメント
- ジャンプ ステートメント
- 例外処理ステートメント
- Checkedステートメント
- awaitステートメント*2
- yield return ステートメント
- fixed ステートメント*3
- lock ステートメント
- ラベル付きステートメント*4
- 埋め込みステートメント
- 空のステートメント
なお、詳しくは下記のMicrosoftのサイトを参照することをお勧めしますが誤訳というか翻訳してはいけないキーワード*5が直訳で記載されていたりするので戸惑わないようにしてください。
今更ながらのローカル変数
今ならながら、ローカル変数に関して仕様を確認する。
こういう仕様は、実は言語ごとに微妙に違っていたりして確認すると楽しいことが時々あるので好きなんだけど、今回意外だったのは次の2点。
まず1点目。C#が静的な型付き言語である点に関しては、普通に変数の宣言時に型も一緒に定義しているので特にこれといって驚くことではなかったのですが、実は例外にvarが入っていなかったことに引っ掛かりを覚えました。確か変数の型をvarで定義すると、実際にはどの型として扱ってもよかったような気がしたのですが…
これに関してちょっと調べてみると、実はvarは最初に使われる時の変数の型にコンパイラが自動的に置き換えているだけで静的な型付きの範囲から花ずれてはいないようでした。
次が宣言空間に関してで、これは具体的には、下記の様なコードはエラーになるというもの。ネストの宣言空間内では親の宣言空間内の変数と名前が重複してはいけないのだそうな…
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Boolean flg = true;
int i = 0;
if (flg)
{
int i = 1; //コンパイルエラー
}
}
}
}
あと、宣言空間に関してはもう一つルールがあり、ブロックのどこで定義しても振る舞いは変わらないとなっています。つまり、こんなのもNGです。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Boolean flg = true;
if(flg)
{
int i = 1;
}
int i = 0; //コンパイルエラー
}
}
}
この二つを知らないでコンパイルエラー*1出されると、結構苦しいかも?
*1:CS0136 ローカルまたはパラメーター 'i' は、その名前が外側のローカルのスコープでローカルやパラメーターの定義に使用されているため、このスコープでは宣言できません。 Program.cs 18 アクティブ
ノマドな気分を味わってみる
今日は気分転換に近所のイオンのフードコートにWindows Tabletを持参してプログラミングしてみた。
少々騒がしいが、いざプログラミングを始めてしまえば周りのことは全く気にならない性質なので特に問題はなく、ミスタードーナツのカフェオレを楽しみながら思ったよりも快適に進めることができた。
しかし、今日はお試し気分だったので1時間半ほどで切り上げて家に帰ったまではよかったが、調子に乗ってカフェオレをおかわりしていたのが胃に悪かったようで夕飯が食べられなかった…
それはさておき、本日コーディングした分はWindows TabletからSourceTreeを使用してローカルのGitリポジトリに保存した後、更にBitBucketに登録してみたが結構簡単に成功。その後、自宅のDesktop PCでSource Treeを使って変更内容を反映してみたが問題なく使用できたので、これでようやく*1ノマドな気分でプログラミングを楽しめるようになった。
*1:ここまで来るのに約二か月間を費やした訳だが、休日出勤と残業の嵐の中でのことなので、飽きずに何とか継続させている自分をちょっとだけほめてあげてもよい気がした
開発環境 (Visual Studio Community) をインストール 2
一度はあきらめたどこでも開発環境の野望だったが、Windows10 tablet *1 を既に購入してしてしまったのでこのままというのももったいない…という貧乏性故に結局諦めきれなかった。
あと、日本メーカー製PCあるあるの不要なソフトが山盛り状態なのにも我慢できなかったので、結局一度Windows 10 のクリーンインストールをしてeMMCの空きを出来るだけ増やした状態にし、再度Visual Studio 2015のインストールを試みることにした。
結果は大成功で、何とか無理無理*2開発環境をWindows 10 tabletに導入。なお、注意すべき点はNECはドライバの公開をしていないのでリカバリメディアを作成する前にクリーンインストールをしてしまうと最悪1万円以上出してリカバリメディアを購入する必要があること。*3
以下に簡単に手順を示す。
準備物
- USB接続可能なネットワークアダプタ (Windows 10 対応)を準備
- Windows 10 インストール用のUSBメモリを準備
手順
- 下記からWindows 10 のインストールメディアを作成するツールをダウンロード
- ダウンロードしたツールで「他のPC用にインストールメディアを作る」を選択し、事前に用意したUSBでWindows 10 のインストールデバイスを作成する
- tabletにWindows 10 を新規インストールする。
- インストール完了後、インストールに使用したUSBメモリを取り外し、ネットワークアダプタに付け替える
- インターネットから無線LANのドライバをダウンロードしてインストール*4
- 以降、USBのネットワークアダプタも不要なので取り外し、デバイスマネージャで認識できていないデバイスのドライバを一つずつインターネットからダウンロードしてインストール*5
余計なものが入っていないPCは使っていて実に気分が良い。
開発環境 (Visual Studio Community) をインストール
何はともあれC#での開発なので、開発環境には迷わずWindows 10 + Visual Studioを選択。バージョンは最新版の2015 Community update2をインストール。昔と違って静的解析までしてくれるのが*1嬉しい。
ただ、MicrosoftのサイトからVisual Studioのインストーラをダウンロードしてその後ネットワーク経由でインストールのを行ったのだが、なぜかAndroidのEmulatorだけインストールに失敗。仕方がないので、「設定」→「システム」→「アプリと機能」から「Microsoft Visual Studio Community 2015 with update 2」の「変更」を選択し、再度セットアップ画面を立ち上げ「修復」を実行。今度は何事もなくインストールが終わって新規にAndroidのEmulatorもインストールされて一安心。なぜ失敗したのかが謎のままなのが気にはなるが…
なお、どこでも開発環境の野望を叶えようとWindows10 tabletも購入。メモリ4GB、最新CPU (ATOMだけど) が決め手でNECのPC-TW710CBSにしたのだが、起動ディスクがeMMCの64GBで、Visual Studioに色々オプションつけると空き容量不足でインストールできないことが判明してしまった…無念だ。
LAVIE Tab W(タブレット)|NEC:121ware.com
*1:Visual Studio 2008を使っていたときは静的解析ツールが高くて使えるものを探すのに苦労した