かずきのBlog

C#やJavaやRubyとメモ書き

目次

Blog 利用状況

ニュース

わんくまBlogが不安定になったため、前に書いてたはてなダイアリーにメインを移動します。
かずきのBlog@Hatena
技術的なネタは、こちらにも、はてなへのリンクという形で掲載しますが、雑多ネタははてなダイアリーだけに掲載することが多いと思います。
コメント
プログラマ的自己紹介
お気に入りのツール/IDE
プロフィール
経歴
広告
アクセサリ

書庫

日記カテゴリ

[.NET][C#]当然っちゃ当然だけどDataTableとか使いようによっては遅い その2

前回:[.NET][C#]当然っちゃ当然だけどDataTableとか使いようによっては遅い

前回の続きです。
前回は、DataTableからのデータの読み取りの性能ばっかり見てましたが、書き込み時も、ちょっと気を抜くと、性能劣化が起きたりします。

BeginEdit, EndEdit

DataRowの複数カラムの値を更新する際に、更新前と更新後をBeginEditとEndEditメソッドで囲むことで、性能が桁違いになったりします。
百聞は一見にしかずなので、実際にテスト用プログラムを組んで実行してみました。

using System;
using System.Data;
using System.Diagnostics;

namespace DataRowAccess
{
    class Program
    {
        // 列数
        private const int COLUMN_COUNT = 30;

        // 行数
        private const int ROW_COUNT = 50000;

        static void Main(string[] args)
        {
            var dt = MakeDataTable();
            NoBeginEditAndEndEdit(dt);
            dt.AcceptChanges(); // 一旦変更を反映
            BeginEditAndEndEdit(dt);
        }

        // テスト用データテーブルを作成する
        private static DataTable MakeDataTable()
        {
            var dt = new DataTable();
            // カラム作成
            for (int i = 0; i < COLUMN_COUNT; i++)
            {
                dt.Columns.Add("COL_" + i, typeof(string));
            }

            // 行データ追加
            for (int i = 0; i < ROW_COUNT; i++)
            {
                var row = dt.NewRow();
                foreach (DataColumn col in dt.Columns)
                {
                    row[col] = col.ColumnName + "_" + i;
                }
                dt.Rows.Add(row);
            }

            return dt;
        }

        // BeginEditとEndEdit無し
        private static void NoBeginEditAndEndEdit(DataTable dt)
        {
            var watch = new Stopwatch();
            watch.Start();
            foreach (DataRow row in dt.Rows)
            {
                foreach (DataColumn col in dt.Columns)
                {
                    row[col] = "XXXX";
                }
            }
            watch.Stop();
            Console.WriteLine("BeginEdit,EndEdit無し: " + watch.ElapsedMilliseconds + "ms");
        }

        // BeginEditとEndEdit有り
        private static void BeginEditAndEndEdit(DataTable dt)
        {
            var watch = new Stopwatch();
            watch.Start();
            foreach (DataRow row in dt.Rows)
            {
                row.BeginEdit();
                foreach (DataColumn col in dt.Columns)
                {
                    row[col] = "OOOO";
                }
                row.EndEdit();
            }
            watch.Stop();
            Console.WriteLine("BeginEdit,EndEdit有り: " + watch.ElapsedMilliseconds + "ms");
        }

    }

}

DataTableにダミーデータを詰め込んで、BeginEdit,EndEditの有無で、データの書き込み速度を比較しています。

実行してみると・・・
image

ぜんぜん違います。
ここまで極端に性能差が出ることは、あまりないかもしれませんが、複数列の値をどかっと書き換える処理なんかでは、有効活用しましょう。

投稿日時 : 2009年9月23日 1:05

Feedback

# re: [.NET][C#]当然っちゃ当然だけどDataTableとか使いようによっては遅い その2 2009/09/23 19:17 もりお

DataTable の RowChange イベントの発生回数が減る分
早くなるという認識であっていますかしら。
これほどとは思いもよらなんだ。

# re: [.NET][C#]当然っちゃ当然だけどDataTableとか使いようによっては遅い その2 2009/09/26 1:43 かずき

あとは、制約のチェックとかも、EndEdit時に行われるみたいなので、そこも効率化されていると思います。

# [.NET][C#]DataTableからのデータ抽出方法の性能比較 2009/12/17 22:34 かずきのBlog

[.NET][C#]DataTableからのデータ抽出方法の性能比較

# re: [.NET][C#]当然っちゃ当然だけどDataTableとか使いようによっては遅い その2 2009/12/17 23:42 ひらぽん

これは知らなんだ!大変参考になります!
今のプロジェクトで行の更新が頻繁に出てくるので早速試させて頂きます!!

# re: [.NET][C#]当然っちゃ当然だけどDataTableとか使いようによっては遅い その2 2009/12/17 23:50 かずき

BeginEditとEndEditの間で1列しか更新してない場合は、逆に遅くなったりするとかあるので気をつけてください~。
そうじゃなければ、早くなると思います。

後、BeginEditとEndEditで挟むと、制約違反の値を代入したときに例外が出るタイミングとかも変わるので気をつけてください。

# re: [.NET][C#]当然っちゃ当然だけどDataTableとか使いようによっては遅い その2 2009/12/18 0:40 ひらぽん

了解です。ありがとうございます~!(^ω^)

# If my problem was a Death Star, this aritlce is a photon torpedo. 2011/07/08 0:22 Unity

If my problem was a Death Star, this aritlce is a photon torpedo.

# That's way the beestst answer so far! 2011/07/09 22:18 Cade

That's way the beestst answer so far!

# Hi there! 2012/03/07 17:15 Berrymall

I just can not imagine with incredibly blog greatly that saved me! God bless you “Democracy does not guarantee equality of conditions. It only guarantees equality of opportunity.” - Irving Kristol

# nike air max 90 2012/12/08 2:31 http://superairmaxshoes1.webs.com/

I conceive this web site has some real superb information for everyone :D. "The ground that a good man treads is hallowed." by Johann von Goethe.

# トリーバーチ 靴安い 2012/12/14 20:38 http://www.torybruchjp.info/category/トリーバーチ

Think it such as a journal or simply a magazine of general interest for those who to look at. Funny, witty, controversial, entertaining, useful, acerbic, thoughtful, serious, curious, unexpected comebacks are welcome.

# sac longchamp soldes 2012/12/15 15:43 http://www.soldesacslongchamp.info

The fashion don't times more flat as well as Philips doesn't make a travel pouch with the package.

# bags burberrry 2012/12/15 22:46 http://www.burberryuksale.org

i commend you within your great articles and other content and excellent topic options.

# burberry cheap sale 2012/12/17 2:39 http://www.ukburberryoutlet.info/category/burberry

Think it to be a journal or simply a magazine in general interest for people who to read. Funny, witty, controversial, entertaining, useful, acerbic, thoughtful, serious, curious, unexpected comebacks really are welcome.

# michael kors sac pas cher 2012/12/18 20:06 http://sacmichaelkorssoldes.monwebeden.fr/#/photos

I comprehend everybody may hate to them, but I don't think they search so negative.

# la vente Burberry 2012/12/19 13:36 http://sacburberrysoldesfr.webnode.fr/actualites

Those are considerably more awesome. Looks enjoy klipsch is defined as made to partner with iProducts? I will want android products!

# sneakersisabelmarantsolde.monwebeden.fr 2012/12/22 17:42 http://sneakersisabelmarantsolde.monwebeden.fr

I guess My group is not the only one having the enjoyment here!

# yezi20160620@163.com 2017/09/28 10:16 wwwww

http://www.jordan6.us.com
http://www.adidasnmdrunner.us.com
http://www.adidastubular.us.com
http://www.hoganoutlet.cc
http://www.outletlongchamp.us.com
http://www.adidasultra.us.com
http://www.rosherun.us.com
http://www.longchampbags.us.org
http://www.adidassuperstar.org.uk
http://www.airjordan.us.com
http://www.adidasyeezyshoes.us.org
http://www.adidastubular.co.uk
http://www.goldengoose-snearkers.com
http://www.airhuarache.uk
http://www.nikeairmax2018.us.com
http://www.vancleefarpels.us.com
http://www.pradasunglasses.us.org
http://www.kyrie3.us.com
http://www.nike-huarache.com
http://www.cheapretro-jordans.com
WWWW

# re: [Tips][Visual Studio]Visual Studio 2008で、ソースコードの行数をカウントする方法 2017/09/29 9:57 chenlina

http://www.air-jordanpascher.fr
http://www.katespadehandbagsoutlet.us.org
http://www.uggbootsaustralia.us.org
http://www.jordanretro.us
http://www.blackhawksjersey.com
http://www.mlbjerseys.org
http://www.michael-kors-outlet.eu.com
http://www.timberlandoutlet.name
http://oakley.sunglassescheap.us.com
http://www.cheaplouboutinshoesuk.org.uk

# re: [.NET][C#]当然っちゃ当然だけどDataTableとか使いようによっては遅い その2 2017/11/28 12:02 cc

http://www.air-max.us.com
http://www.nikerosheone.us.com
http://www.ferragamobelt.us
http://www.jordansforcheap.us.com
http://www.outletonlinekatespade.us.com
http://www.basketball-shoes.us.com
http://www.patriotsjerseys.us.com
http://www.nikepolo.us
http://www.reebokoutlet.us.org
http://www.adidasnmds.com
http://www.kyrie3.us.com
http://www.fitflops-saleclearance.us.com
http://www.adidassuperstar.us.com
http://www.boostyeezy.us.com
http://www.yeezyboost350v2.org.uk
http://www.goldengoose-outlet.us.com
http://www.rosherun.us.com
http://www.adidasnmdrunner.us.com
http://www.hermes-birkin.us.com
http://www.outlettimberland.us.org
http://www.balenciagashoes.us.com
http://www.stephencurry-shoes.us.com
http://www.nikerosheone.co.uk
http://www.nikemercurial.us.com
http://www.tomford-sunglasses.us.com
http://www.adidasstansmith.us.com
http://www.nikeairmax2018.us.com
http://www.nikezoom.us.com
http://www.toryburchshoes.org.uk
http://www.michaelkors-outletsonline.us.com

タイトル  
名前  
Url
コメント