アクセス数 累計:000,125,032 昨日:000,000,099 本日:000,000,054
|
|
|
|
【Amazon ランキング:本 - ビジネス・経済】
|
前回「リストは配列」というページで 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. |
|
|
|