আমাদের কাছে একটি স্বল্প পদ্ধতি রয়েছে যা .csv ফাইলটিকে একটি দেখার জন্য বিশ্লেষণ করে:
ILookup<string, DgvItems> ParseCsv( string fileName )
{
var file = File.ReadAllLines( fileName );
return file.Skip( 1 ).Select( line => new DgvItems( line ) ).ToLookup( item => item.StocksID );
}
এবং ডিজিভিটেমসের সংজ্ঞা:
public class DgvItems
{
public string DealDate { get; }
public string StocksID { get; }
public string StockName { get; }
public string SecBrokerID { get; }
public string SecBrokerName { get; }
public double Price { get; }
public int BuyQty { get; }
public int CellQty { get; }
public DgvItems( string line )
{
var split = line.Split( ',' );
DealDate = split[0];
StocksID = split[1];
StockName = split[2];
SecBrokerID = split[3];
SecBrokerName = split[4];
Price = double.Parse( split[5] );
BuyQty = int.Parse( split[6] );
CellQty = int.Parse( split[7] );
}
}
এবং আমরা দেখতে পেয়েছি যে আমরা যদি এর ToArray()
আগে একটি অতিরিক্ত যোগ করি ToLookup()
:
static ILookup<string, DgvItems> ParseCsv( string fileName )
{
var file = File.ReadAllLines( fileName );
return file.Skip( 1 ).Select( line => new DgvItems( line ) ).ToArray().ToLookup( item => item.StocksID );
}
পরবর্তীটি উল্লেখযোগ্যভাবে দ্রুত হয়। আরও সুনির্দিষ্টভাবে, ১.৪ মিলিয়ন লাইনের সাহায্যে পরীক্ষার ফাইলটি ব্যবহার করার সময়, প্রাক্তনটি প্রায় ৪.৩ সেকেন্ড এবং দ্বিতীয়টি প্রায় ৩ সেকেন্ড সময় নেয়।
আমি প্রত্যাশা করি ToArray()
অতিরিক্ত সময় নেওয়া উচিত তাই উত্তরোত্তরটি কিছুটা ধীর হওয়া উচিত। এটি আসলে দ্রুত কেন?
অতিরিক্ত তথ্য:
আমরা এই সমস্যাটি খুঁজে পেয়েছি কারণ এখানে আরও একটি পদ্ধতি রয়েছে যা একই .csv ফাইলটিকে বিভিন্ন ফর্ম্যাটে পার্স করে এবং এটি প্রায় 3 সেকেন্ড সময় নেয় তাই আমরা মনে করি যে এটি 3 সেকেন্ডের মধ্যে একই জিনিসটি করতে সক্ষম হবে।
মূল ডেটা টাইপ হয়
Dictionary<string, List<DgvItems>>
এবং মূল কোড লিনক ব্যবহার করে না এবং ফলাফলটিও একই রকম।
বেঞ্চমার্কডটনেট পরীক্ষার শ্রেণি:
public class TestClass
{
private readonly string[] Lines;
public TestClass()
{
Lines = File.ReadAllLines( @"D:\20110315_Random.csv" );
}
[Benchmark]
public ILookup<string, DgvItems> First()
{
return Lines.Skip( 1 ).Select( line => new DgvItems( line ) ).ToArray().ToLookup( item => item.StocksID );
}
[Benchmark]
public ILookup<string, DgvItems> Second()
{
return Lines.Skip( 1 ).Select( line => new DgvItems( line ) ).ToLookup( item => item.StocksID );
}
}
ফলাফল:
| Method | Mean | Error | StdDev |
|------- |--------:|---------:|---------:|
| First | 2.530 s | 0.0190 s | 0.0178 s |
| Second | 3.620 s | 0.0217 s | 0.0203 s |
আমি মূল কোডে অন্য একটি পরীক্ষা বেস করেছি did দেখে মনে হচ্ছে সমস্যা লিনকের নয়।
public class TestClass
{
private readonly string[] Lines;
public TestClass()
{
Lines = File.ReadAllLines( @"D:\20110315_Random.csv" );
}
[Benchmark]
public Dictionary<string, List<DgvItems>> First()
{
List<DgvItems> itemList = new List<DgvItems>();
for ( int i = 1; i < Lines.Length; i++ )
{
itemList.Add( new DgvItems( Lines[i] ) );
}
Dictionary<string, List<DgvItems>> dictionary = new Dictionary<string, List<DgvItems>>();
foreach( var item in itemList )
{
if( dictionary.TryGetValue( item.StocksID, out var list ) )
{
list.Add( item );
}
else
{
dictionary.Add( item.StocksID, new List<DgvItems>() { item } );
}
}
return dictionary;
}
[Benchmark]
public Dictionary<string, List<DgvItems>> Second()
{
Dictionary<string, List<DgvItems>> dictionary = new Dictionary<string, List<DgvItems>>();
for ( int i = 1; i < Lines.Length; i++ )
{
var item = new DgvItems( Lines[i] );
if ( dictionary.TryGetValue( item.StocksID, out var list ) )
{
list.Add( item );
}
else
{
dictionary.Add( item.StocksID, new List<DgvItems>() { item } );
}
}
return dictionary;
}
}
ফলাফল:
| Method | Mean | Error | StdDev |
|------- |--------:|---------:|---------:|
| First | 2.470 s | 0.0218 s | 0.0182 s |
| Second | 3.481 s | 0.0260 s | 0.0231 s |
.ToArray()
কল ছাড়াই কলটি কল করার .Select( line => new DgvItems( line ) )
আগে একটি মূল সংখ্যা ফেরত দেয় ToLookup( item => item.StocksID )
। এবং একটি নির্দিষ্ট উপাদান সন্ধান করা অ্যারের চেয়ে আইনিম্যারেবল ব্যবহার করা আরও খারাপ। একটি অ্যারে রূপান্তর এবং সম্ভবত একটি তাত্পর্যপূর্ণ ব্যবহার না করে দেখুন সম্পাদন করা দ্রুত।
var file = File.ReadLines( fileName );
- এর ReadLines
পরিবর্তে ReadAllLines
এবং আপনার কোড সম্ভবত দ্রুততর হবে
BenchmarkDotnet
প্রকৃত পারফ মাপার জন্য ব্যবহার করা উচিত । এছাড়াও, আপনি পরিমাপ করতে চান এমন আসল কোডটি পরীক্ষা করতে এবং আইওকে পরীক্ষায় অন্তর্ভুক্ত না করার চেষ্টা করুন এবং আলাদা করুন।