午後わてんのブログ

ベランダ菜園とWindows用アプリ作成(WPFとC#)

エクセルVBAとC++とC#とVB、それぞれのバブルソートの処理時間

 
アプリやプログラム言語の違いで処理速度がどれだけ違うのかバブルソートを書いて試してみた
この4つで1万件のランダム数値配列をバブルソートする時間
 
イメージ 1
1万件バブルソート時間(秒)
アプリ		言語	時間
エクセル		VBA	18.902 
Visual Studio	VB	0.844 
Visual Studio	C#	0.852 
Visual Studio	C++	0.578 
 
 
エクセルVBAだけ遅い、かなり遅い
一番速いのはC++VBC#はほとんど同じでC++の1.5倍くらいかかっている
ソートアルゴリズムを調べていたときにプログラムの例や処理時間も掲載されているのを見ていて、C言語ってのが速いんだなあって印象だった
C言語を調べていたらC++とかなり近いらしいことがわかってC++ならVisual Studioにもあったはず!ってことであちこち参考にしてバブルソート書いて計測したら0.6秒!エクセルVBAで18秒かかっていたのが0.6秒!
やっぱりC++は速いんだなあと思いつつ名前が似ているC#ならどうなんだろうと試したら0.85秒、速い、ってことはC系が速くてVB系が遅いのかなあと思いつつVBも試したらC#と同じ0.85秒
結果エクセルVBAが特別遅いことがわかったw
 
 
 
C++は初めて使ってみたんだけど難しい、文字列の扱い方がVBとは全然ちがって文字の配列って扱いで、その配列はメモリのアドレスのようなポインタで扱うとか、なのでよくわかっていない状態で書いたから本当はもっと速いはず
2017/04/23追記
文字列の扱いが文字の配列なのはC言語だった、C++VBと同じように扱えるみたい
追記ここまで
 
#include <stdio.h>
#include <time.h>    //時間計測に必要
#include <Windows.h>//乱数生成に必要

void BubbleSort2(int v[], int vr);

int main(void)
{   
    const int vr = 10000;
    int v[vr];
    //ランダム数値配列作成
    srand((unsigned int)time(NULL));//乱数シードを現在時から生成
    for (int i = 0; i < vr; ++i) {
        v[i] = (int)rand();//乱数
    }

    int mys = GetTickCount();
    BubbleSort2(v, vr);//バブルソート
    printf("C++で%d件バブルソート時間:%dミリ秒\n",vr, GetTickCount() - mys);

    return 0;
}

void BubbleSort2(int v[],int vr)
{
    int tmp;
    for (int i = 0; i < vr; ++i) {
        for (int j = 0; j < vr - 1; ++j) {
            if (v[j] > v[j + 1]) {
                tmp = v[j];
                v[j] = v[j + 1];
                v[j + 1] = tmp;
            }
        }
    }
}
 
 

f:id:gogowaten:20191031115915p:plain

f:id:gogowaten:20191031115905p:plain

 
C++で参照したところ
Programming Place Plus C言語編 トップページ
http://ppp-lab.sakura.ne.jp/ProgrammingPlacePlus/c/index.html

Visual C++ 2010 Express の易しい使い方(1)―― コンソールアプリケーション の場合 ――
http://ishidate.my.coocan.jp/vcpp10_1/vcpp10_1.htm

C++マニアック,C++入門,C++講座,よくわかるC++言語プログラミング講座
http://stlalv.la.coocan.jp/index.html
 
 
 
 
 
 
using System;

namespace csc20170417
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 4;
            int[] v = new int[10];
            Random r = new Random();
            System.Diagnostics.Stopwatch s = new System.Diagnostics.Stopwatch();
            s.Start();
            const int vr = 10000;
            v = new int[vr];
            for(i = 0; i < v.Length; ++i)
            {
                v[i] = r.Next(vr);
            }
            BubbleSort1(v);
            Console.WriteLine($"C#で{vr}件のバブルソート時間:{s.ElapsedMilliseconds}ミリ秒");
        }

        public static void BubbleSort1(int[] v)
        {
            int tmp;
            for(int i = 0; i < v.Length; ++i)
            {
                for(int j = 0; j < v.Length - 1; ++j)
                {
                    if (v[j] > v[j + 1])
                    {
                        tmp = v[j];
                        v[j] = v[j + 1];
                        v[j + 1] = tmp;
                    }
                }
            }
        }
    }
}
 
 
C#もここまでたくさん書いたのは初めて、C++と似ているねえ{}がいっぱい、区切りでは;をつけるとか
 

f:id:gogowaten:20191031120044p:plain

C#で参照したところ
++C++; // 未確認飛行 C
http://ufcpp.net/

2-8 基本的なメソッド定義と呼び出し
https://msdn.microsoft.com/ja-jp/library/cc482665.aspx

 
 
 
 
VBはエクセルVBAとほとんど同じだからラク
 
Module Module1
    Sub Main()
        Const vr As Integer = 10000
        Dim v(vr - 1) As Integer
        Dim r As New Random
        For i As Integer = 0 To vr - 1
            v(i) = r.Next(vr)
        Next
        Dim s As New Stopwatch
        s.Start()
        Call BubbleSort1(v)
        Console.WriteLine($"VBで{vr}件バブルソート時間:{s.ElapsedMilliseconds}ミリ秒")
    End Sub

    Sub BubbleSort1(v() As Integer)
        Dim tmp As Integer
        For i = 0 To UBound(v)
            For j = 0 To UBound(v) - 1
                If v(j) > v(j + 1) Then
                    tmp = v(j)
                    v(j) = v(j + 1)
                    v(j + 1) = tmp
                End If
            Next
        Next
    End Sub
End Module
 

やっぱりVBが落ち着くなあ、でも1週間くらいC++を調べていたあとにVBを書いたら末尾に;を付けないと違和感があるようになってた
 

f:id:gogowaten:20191031120136p:plain

 
 
イメージ 2
 
 
 
 
2017/11/27追記ここから
 
計測したパソコンの環境、OS以外は2009年の古いパソコン
OS Windows 10
エクセル Excel 2007
CPU  AMD PhenomⅡX3 720BE
 
 
ExcelVBAでのプロシージャは↓の記事のtestBubble1は
1ヶ月前
エクセルVBAバブルソート ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
https://blogs.yahoo.co.jp/gogowaten/14787146.html
 
2017/11/27追記ここまで
 
 
 
 
関連記事
2週間前
エクセルVBAで、ソートアルゴリズムとデータの違いによるソート処理時間比較 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
https://blogs.yahoo.co.jp/gogowaten/14836198.html