すらすらプログラマーへのお問い合わせ
すらすらのブログ
アクセス数  累計:000,683,158  昨日:000,000,166  本日:000,000,185
Loading
やってみよう!
.NET プログラミング
プロパティグリッド
印刷
リストボックス
スレッド
リストビュー
インストーラー
やってみよう!

できるVisual Studio 2015 Windows /Android/iOS アプリ対応

独習C# 第3版

VisualBasic2013パーフェクトマスター (Perfect Master SERIES)

プログラミング.NET Framework 第4版 (Microsoft Press)

VisualBasic2013逆引き大全555の極意

猫でもわかるWindowsプログラミング 第4版 (猫でもわかるプログラミング)

VisualC#2013逆引き大全555の極意

Linked リストは速い? 最終更新:2010/07/15
【Amazon ランキング:DVD - キッズ・ファミリー】

前回「リストは配列」というページで Listクラスの検証を行いましたが、もうひとつListクラスと同様の機能を持った Linked List クラスというものが存在します。
どうやらこのクラスの内部はリスト構造になっているみたいですのでListクラスとどのぐらい速度差があるのか検証してみました。
検証プログラム作成
Linked ListクラスとListクラスの速度差を検証するために以下のようなプログラムを作成しました。
C#[LinkedListForm.cs]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace list
{
    
public partial class LinkdListForm : Form
    {
        
public LinkdListForm()
        {
            InitializeComponent();
        }

        
private const int LOOP_CNT = 50000;

        
/// <summary>
        /// リストに追加
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            
// ========== 配列リスト ==========
            DateTime t = DateTime.Now;

            
for (int i = 0; i < 200; i++)
            {
                
List<int> arraylist = new List<int>();

                
for (int j = 0; j < LOOP_CNT; j++)
                {
                    
//arraylist.Add(j);
                    arraylist.Insert(0, j);
                }
            }

            
TimeSpan span = DateTime.Now - t;

            
Console.WriteLine(string.Format(
                
"ArrayList Add time {0}.{1:000}", span.Seconds, span.Milliseconds));

            
// ========== リンクリスト ==========
            t = DateTime.Now;

            
for (int i = 0; i < 200; i++)
            {
                
LinkedList<int> linkdlist = new LinkedList<int>();

                
for (int j = 0; j < LOOP_CNT; j++)
                {
                    
//linkdlist.AddLast(j);
                    linkdlist.AddFirst(j);
                }
            }

            span = 
DateTime.Now - t;

            
Console.WriteLine(string.Format(
                
"LinkdList Add time {0}.{1:000}", span.Seconds, span.Milliseconds));
        }

        
/// <summary>
        /// 配列に変換
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            
List<int> arraylist = new List<int>();
            
LinkedList<int> linkdlist = new LinkedList<int>();

            
for (int j = 0; j < LOOP_CNT; j++)
            {
                arraylist.Add(j);
                linkdlist.AddLast(j);
            }

            
// ========== 配列リスト ==========
            DateTime t = DateTime.Now;

            
for (int j = 0; j < LOOP_CNT; j++)
            {
                
int[] buf = arraylist.ToArray();
            }

            
TimeSpan span = DateTime.Now - t;

            
Console.WriteLine(string.Format(
                
"ArrayList ToArray time {0}.{1:000}", span.Seconds, span.Milliseconds));

            
// ========== リンクリスト ==========
            t = DateTime.Now;

            
for (int j = 0; j < LOOP_CNT; j++)
            {
                
int[] buf = linkdlist.ToArray();
            }

            span = 
DateTime.Now - t;

            
Console.WriteLine(string.Format(
                
"LinkdList ToArray time {0}.{1:000}", span.Seconds, span.Milliseconds));
        }

        
/// <summary>
        /// リムーブ
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_Click(object sender, EventArgs e)
        {
            
List<int> arraylist = new List<int>();
            
LinkedList<int> linkdlist = new LinkedList<int>();

            
for (int j = 0; j < LOOP_CNT * 10; j++)
            {
                arraylist.Add(j);
                linkdlist.AddLast(j);
            }

            
// ========== 配列リスト ==========
            DateTime t = DateTime.Now;

            
for (int j = LOOP_CNT * 10 - 1; 0 < j; j--)
            {
                
//arraylist.RemoveAt(0);
                arraylist.RemoveAt(j);
            }

            
TimeSpan span = DateTime.Now - t;

            
Console.WriteLine(string.Format(
                
"ArrayList Remove time {0}.{1:000}", span.Seconds, span.Milliseconds));

            
// ========== リンクリスト ==========
            t = DateTime.Now;

            
for (int j = LOOP_CNT * 10 - 1; 0 < j; j--)
            {
                
//linkdlist.RemoveFirst();
                linkdlist.RemoveLast();
            }

            span = 
DateTime.Now - t;

            
Console.WriteLine(string.Format(
                
"LinkdList Remove time {0}.{1:000}", span.Seconds, span.Milliseconds));
        }
    }
}
検証結果
先頭追加 後方追加 先頭削除 後方削除 配列変換
Listクラス 31.490 秒 0.093 秒 43.824 秒 0.004 秒 7.228 秒
Linked Listクラス 0.553 秒 0.519 秒 0.008 秒 0.008 秒 14.509 秒
計測した結果、List と Linked List の内部構造の違いによる特徴がよくあらわれた結果となりました。Lined List はインデックスの再構成が必要な場面でも高速に処理できることがわかります。ただし要素へのアクセスは List クラスの方が高速なようです。シチュエーションに合わせてうまく使い分ければプログラムのパフォーマンス向上が期待できそうです。
※このページで紹介しているサンプルコードについて管理者は動作保障をいたしません※
※サンプルコードを使用する場合は、自己責任でお願いします※

【楽天 ランキング:スマートフォン】




このサイトはフリーソフトのMerge HTMLで作成されています。
このサイトはリンクフリーです。

ページの先頭に戻る Copyright© 2010-2015 Jun.Shiozaki All rights reserved.