趣味で始めるプログラミング

プログラミングを個人の趣味として楽しむブログ

組み込みデータ型とちょっとした疑問に関する実験

今回は組み込みデータ型に関して

 

組み込みデータ型は大きく分けて「数値」「文字列」「真理値」「object」の4種類。もう少し詳細にはMicrosoftの下記サイトを参照してもらうのが確実だけど、大まかに理解する分には問題ないと思う。

 

組み込み型の一覧表 (C# リファレンス)

 

この中で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は混在させずに使い分けるのがよさそうだ…

*1:64bit版Windows7 + VisualStudio2015で計測

*2:10倍以上

*3:10%以上

*4:誰か教えてください!

プリプロセッサ ディレクティブ

普段コーディングではコンパイルシンボルくらいしか使っていないけれど、調べてみるとこれまた色々種類があって新しい発見が。具体的には以下の6種類で、特にVisualStudioを使っている身としては#region ~ #endregionがコメント代わりに使いやすくてよさそうな気がします。

あと、最後の条件付きメソッドは#ifdef DEBUG~#endifが複雑になりやすいのをすっきり記述できるので、これも積極的に採用するべきかな。

 

 

#region~#endregionを用いたコメントの例f:id:BBJackal:20160528013120p:plain f:id:BBJackal:20160528013036p:plain

*1:いわゆるコンパイルシンボル

*2:未実装コードの実装忘れなどに使用?

*3:hidden属性でステップ実行時に停止しなくなるらしいが…使用する??

*4:Cの様に把握できないほど大量のオプションはなく警告の抑制機能のみの様だ

*5:コメント用

ステートメントに関して

今回はステートメントに関して調べてみました。

こちらも普段何気なく使っていますが、実は結構な種類があり見ていくと面白いかもと思っていたのですが、C#でもunsafeを使うことでポインタが使える*1とか驚きました。

以下にステートメントの種類を記載します。

 

 

なお、詳しくは下記のMicrosoftのサイトを参照することをお勧めしますが誤訳というか翻訳してはいけないキーワード*5が直訳で記載されていたりするので戸惑わないようにしてください。

ステートメント (C# プログラミング ガイド)

*1:あまり使うものではないでしょうが、いざという時知っているのと知っていないのでは大違いと思われます

*2:Microsoftこのサイトが図解してあって分かりやすい

*3:C#であえてポインタを使う場合に使用する

*4:悪名高きgotoのラベルに使用。エラー処理など使いどころを考えればそこまで嫌うこともないような気もしますが…

*5:awaitが「待機します。」になっていたり…

今更ながらのローカル変数

今ならながら、ローカル変数に関して仕様を確認する。

 

こういう仕様は、実は言語ごとに微妙に違っていたりして確認すると楽しいことが時々あるので好きなんだけど、今回意外だったのは次の2点。

 

  • C#は基本的に静的な型付き言語で例外はobject型とdynamicの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

以下に簡単に手順を示す。

 

準備物

  1. USB接続可能なネットワークアダプタ (Windows 10 対応)を準備
  2. Windows 10 インストール用のUSBメモリを準備

手順

  1.  下記からWindows 10 のインストールメディアを作成するツールをダウンロード

    Windows 10

  2. ダウンロードしたツールで「他のPC用にインストールメディアを作る」を選択し、事前に用意したUSBでWindows 10 のインストールデバイスを作成する
  3. tabletWindows 10 を新規インストールする。
  4. インストール完了後、インストールに使用したUSBメモリを取り外し、ネットワークアダプタに付け替える
  5. インターネットから無線LANのドライバをダウンロードしてインストール*4
  6. 以降、USBのネットワークアダプタも不要なので取り外し、デバイスマネージャで認識できていないデバイスのドライバを一つずつインターネットからダウンロードしてインストール*5

 

余計なものが入っていないPCは使っていて実に気分が良い。

*1:NECのPC-TW710CBS

*2:インストール後のeMMCの空きは5.05GBしかなかった…

*3:私はそんな事つゆ知らずにクリーンインストールしてので、もう少しで痛い目に合うところだった

*4:デバイスマネージャのドライバーソフトウェアの更新でインターネットからブロードコム製のドライバを勝手に探してきてくれる

*5:依存関係のあるドライバもあり、また警告状態になっていなくてもダウンロード可能なデバイスがあって実はかなり面倒…

開発環境 (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もインストールされて一安心。なぜ失敗したのかが謎のままなのが気にはなるが…

 

Downloads | Visual Studio

 

なお、どこでも開発環境の野望を叶えようとWindows10 tabletも購入。メモリ4GB、最新CPU (ATOMだけど) が決め手でNECのPC-TW710CBSにしたのだが、起動ディスクがeMMCの64GBで、Visual Studioに色々オプションつけると空き容量不足でインストールできないことが判明してしまった…無念だ。

 

LAVIE Tab W(タブレット)|NEC:121ware.com

*1:Visual Studio 2008を使っていたときは静的解析ツールが高くて使えるものを探すのに苦労した