TeraOmegaNetwork 2.0
<2010年9月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

macでVS2010
iPadでVS2010
ミニノートPCでVS2010
C# 3.0 LINQ Sort
ぱられる。ふぉー
Parallel.For
C#4.0 続2 Parallelクラス
C#4.0 続 Parallelクラス
Internet Explorer の検索ボックスを表示しない
2010年度になりました

プログラミング
・C#
・C/C++
・Java
・Visual Basic
・Visual Basic .NET
・色々な言語
・メモ
管理人の落書き
リンク
テンプレート作成支援言語
IEAuto
クラス設計






Web デベロッパー

必要科目
70-536
70-528
70-547



・Sun認定Javaプログラマー(SJC-P 035)
・OracleSilverFaeroe 9i
・UMTP Lv1
・基本情報技術者


・セキュリティスペシャリスト合格
・テンプレート作成支援言語(T言語)を広める事

  お勧め1「テンプレート作成支援言語(T言語)」ver 1.1.1         20010/02/26 更新
テンプレート作成支援言語について
ダウンロードする。

お勧め2「ブラウザ自動操作ツール(IEAuto2009)」ver 1.6.1    20010/03/25 更新
ブラウザ自動操作ツール(IEAuto 2009)について
ダウンロードする。

お勧め3
「データベース更新前更新後比較ツール(DBCMP) Oracle接続可」ver 1.4.0  20010/03/14 新規公開
ダウンロードする。

プログラミング - C#
C#4.0 続2 Parallelクラス

Parallel.Forを使って効率のいい実装方法がMSDNに載っていたので、
それを考慮して再度実行してみました。


C#4.0 続 Parallelクラス
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
using System;
using System.Collections.Generic;
using System.Windows.Forms;

using System.Threading.Tasks;
using System.Threading;
using System.Linq;

namespace MultithreadTest {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
        }

        //いつものfor文
        private void button1_Click(object sender, EventArgs e) {
            long start = System.Environment.TickCount;

            List<int> lst = new List<int>();

            for(int i = 0; i < 10000000; i++) {
                lst.Add(i);
            }

            long sum = 0;
            //254ミリ秒(foreachループ時)
            //foreach(int num in lst) {
            //    sum += num;
            //}
            for(int i = 0; i < 10000000; i++) {
                sum += lst[i];
            }

            long stop = System.Environment.TickCount;

            label1.Text =  (stop - start) + " ミリ秒です。"; //234ミリ秒
        }

        private void button3_Click(object sender, EventArgs e) {
            long start = System.Environment.TickCount;

            List<int> lst = new List<int>();

            for(int i = 0; i < 10000000; i++) {
                lst.Add(i);
            }

            long sum = 0;

            //参考URL:http://msdn.microsoft.com/ja-jp/library/dd460703.aspx
            Parallel.For<long>(0, lst.Count, () => 0, (j, loop, subtotal) => {
                subtotal += lst[j];
                return subtotal;
            },
                (x) => Interlocked.Add(ref sum, x)
            );

            long stop = System.Environment.TickCount;
            label3.Text = (stop - start) + " ミリ秒です。"; //202ミリ秒
        }
    }
}


実装方法がかなり面倒になっています。
ラムダ式(C# 3.0より搭載)まだ習得していないので、良く分からなかったりしますw
上記のような実装をして、Core2 Quad 9450(4コア 2.66Ghz)OS:Win7 Enterpriseで
234ミリ秒 → 202ミリ秒までパフォーマンスが上がりました。
10000000回の計算で、役30ミリ秒って、10000回程度のループでは恩恵無しですね・・・

別のパソコン(Core2 Duo (2コア 1.2GHz)OS:WinXP Professional)だと周波数も下がり(コア数も減ってますが・・・)
本領発揮してくれるか試してみました。
結果は・・・
普通のfor文:359ミリ秒
Paralle.For:422ミリ秒
遅くなってますねw
しかもParalle.Forは安定していなくて、遅いときですと800ミリ秒とか出したりします。

さらに、シングルCPUだとどうなるかということで、
Core2 Quad 9450(4コア 2.66Ghz)OS:Win7 EnterpriseのXPモードを使って試してみました。
普通のfor文:290ミリ秒
Paralle.For:471ミリ秒
遅いですね・・・


単純な計算では恩恵が受けられないんですかね?

・検索キーワード:  C# 4.0

戻る  マイリストへ追加