青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++ Programmer's Cookbook

{C++ 基礎} {C++ 高級} {C#界面,C++核心算法} {設計模式} {C#基礎}

Performance of Iteration Methods (very good)

I've been implementing numerical libraries in .NET and have come to some conclusions about iteration performance. My classes have to hold a large amount of data and be able to iterate through that data as quickly as possible. In order to compare various methods, I created a simple class called Data that encapsulates an array of doubles.

Download source - 6 Kb

Method #1: Enumeration

Data implements IEnumerable. It contains GetEnumerator which returns its own DataEnumerator, an inner class.
public IEnumerator GetEnumerator()
????{
???? returnnew DataEnumerator(this);
????}
????
????internalclass DataEnumerator : IEnumerator
????{
???? private Data internal_=null;
???? privateintindex=-1;

???? public DataEnumerator( Data data)
???? {
????????internal_=data;
???? }

???? publicobject Current
???? {
????????get
????????{
???????? returninternal_.Array[index];
????????}
???? }

???? publicbool MoveNext()
???? {
????????index++;
????????if(index >=internal_.Array.Length )
????????{
???????? returnfalse;
????????}
????????returntrue;
???? }

???? publicvoid Reset()
???? {
????????index=-1;
???? }
????}

Method #2: Indexing

I implemented an index operator on the class which simply calls the index operator on the array.

????publicdoublethis[intposition]
????{
???? get
???? {
????????returnarray_[position];
???? }
????}

Method #3: Indirect Array

I created a property to access the array.

????publicdouble[] Array
????{
???? get
???? {
????????returnarray_;
???? }
????}
When iterating, I called the Array property and then its index operator.
d = data.Array[j];

Method #3: Direct Array

I created a reference to the array.

double[] array = data.Array;
Then, I iterate through that reference.
d = array[j];

Method #4: Pointer Math

Finally, I tried improving performance by iterating through the array in Managed C++ using pointer manipulation.

????????staticvoiditerate( Data&data)
????????{
???????? double d;
???????? double__pin*ptr=&(data.Array[0]);
???????? for(int i =0; i < data.Array.Length; i++)
???????? {
????????????d =*ptr;
????????????++ptr;
???????? }
????????}
I called it this way:
Pointer.iterate( data );

Conclusions

To test the different methods, I allocated 1,000,000 doubles into an array and indexed over all of them. I repeated this 1,000 times to minimize randomness. Here are the results...

Results

Enumeration is always slow. That's not surprising as I'm using a general data structure to hold the doubles. Each access performs a cast. The three operator/property methods differed very slightly. These are probably all optimized similarly. Using pointer math to traverse over the raw data was significantly faster. This is probably due to the fact that there's no bounds checking. In summary, if you have large amounts of data and performance is critical, consider using managed C++.

超級collection類:

using?System;
using?System.Collections;

namespace?Iterations
{
??
public?class?Data?:?IEnumerable
??
{
????
private?double[]?array_;

????
public?Data(int?size)?
????
{
??????array_?
=?new?double[size];
??????Random?random?
=?new?Random();
??????
for?(?int?i?=?0;?i?<?size;?i++?)
??????
{
????????array_[i]?
=?random.Next();
??????}

????}


????
public?double?this[int?position]
????
{
??????
get
??????
{
????????
return?array_[position];
??????}

????}


????
public?double[]?Array
????
{
??????
get?
??????
{
????????
return?array_;
??????}

????}


????
public?IEnumerator?GetEnumerator()?
????
{
??????
return?new?DataEnumerator(?this?);
????}

????
????
internal?class?DataEnumerator?:?IEnumerator
????
{
??????
private?Data?internal_?=?null;
??????
private?int?index?=?-1;

??????
public?DataEnumerator(?Data?data?)?
??????
{
????????internal_?
=?data;
??????}


??????
public?object?Current
??????
{
????????
get
????????
{
??????????
return?internal_.Array[index];
????????}

??????}


??????
public?bool?MoveNext()
??????
{
????????index
++;
????????
if?(?index?>=?internal_.Array.Length?)?
????????
{
??????????
return?false;
????????}

????????
return?true;
??????}


??????
public?void?Reset()
??????
{
????????index?
=?-1;
??????}

????}

??}

}
test code:
using?System;
using?System.Collections;

using?Iterations;

namespace?Test
{
??
class?Test
??
{
????
private?double?d;
????
private?int?reps;
????
private?int?size;
????
private?double?seconds;
????
private?Data?data?=?null;
????
private?DateTime?before;
????
private?TimeSpan?total;

????[STAThread]
????
static?void?Main(string[]?args)
????
{
??????Test?test;
??????
if?(?args.Length?>?1?)?
??????
{
????????test?
=?new?Test(?int.Parse(?args[0]?),?int.Parse(?args[1]?));
??????}
?
??????
else?
??????
{
????????test?
=?new?Test();
??????}

??????test.TestAll();
????}


????
public?Test()?:?this(?1000,?1000000?)
????
{
????}


????
public?Test(?int?reps,?int?size?)
????
{
??????
this.reps?=?reps;
??????
this.size?=?size;
??????data?
=?new?Data(?size?);
????}


????
private?void?TestAll()
????
{
??????System.Console.WriteLine();
??????System.Console.WriteLine(?
"repetitions:?"?+?reps?);
??????System.Console.WriteLine(?
"iterations:?"?+?size.ToString(?"e"?));
??????System.Console.WriteLine();
??????TestEnumeration();
??????TestIndexing();
??????TestIndirectArrays();
??????TestDirectArrays();
??????TestPointerMath();
??????System.Console.WriteLine();
????}


????
private?void?TestEnumeration()?
????
{
??????total?
=?new?TimeSpan(?0?);
??????
for?(?int?i?=?0;?i?<?reps;?i++?)?
??????
{
????????before?
=?DateTime.Now;
????????IEnumerator?enumerator?
=?data.GetEnumerator();
????????
while?(?enumerator.MoveNext()?)?
????????
{
??????????d?
=?(double)?enumerator.Current;
????????}

????????total?
+=?DateTime.Now?-?before;
??????}

??????seconds?
=?total.Seconds?+?(?total.Milliseconds?/?1000.0?);
??????System.Console.WriteLine(?
"Enumeration:?\t\t"?+?seconds?+?"?seconds"?);
????}


????
private?void?TestIndexing()
????
{
??????total?
=?new?TimeSpan(?0?);
??????
for?(?int?i?=?0;?i?<?reps;?i++?)?
??????
{
????????before?
=?DateTime.Now;
????????
for?(?int?j?=?0;?j?<?size;?j++?)
????????
{
??????????d?
=?data[j];
????????}

????????total?
+=?DateTime.Now?-?before;
??????}

??????seconds?
=?total.Seconds?+?(?total.Milliseconds?/?1000.0?);
??????System.Console.WriteLine(?
"Indexing:?\t\t"?+?seconds?+?"?seconds"?);??????
????}


????
private?void?TestIndirectArrays()
????
{
??????total?
=?new?TimeSpan(?0?);
??????
for?(?int?i?=?0;?i?<?reps;?i++?)?
??????
{
????????before?
=?DateTime.Now;
????????
for?(?int?j?=?0;?j?<?size;?j++?)
????????
{
??????????d?
=?data.Array[j];
????????}

????????total?
+=?DateTime.Now?-?before;
??????}

??????seconds?
=?total.Seconds?+?(?total.Milliseconds?/?1000.0?);
??????System.Console.WriteLine(?
"Indirect?Arrays:?\t"?+?seconds?+?"?seconds"?);?
????}


????
private?void?TestDirectArrays()
????
{
??????total?
=?new?TimeSpan(?0?);
??????
for?(?int?i?=?0;?i?<?reps;?i++?)?
??????
{
????????before?
=?DateTime.Now;
????????
double[]?array?=?data.Array;
????????
for?(?int?j?=?0;?j?<?size;?j++?)
????????
{
??????????d?
=?array[j];
????????}

????????total?
+=?DateTime.Now?-?before;
??????}

??????seconds?
=?total.Seconds?+?(?total.Milliseconds?/?1000.0?);
??????System.Console.WriteLine(?
"Direct?Arrays:?\t\t"?+?seconds?+?"?seconds"?);
????}


????
private?void?TestPointerMath()
????
{
??????total?
=?new?TimeSpan(?0?);
??????
for?(?int?i?=?0;?i?<?reps;?i++?)?
??????
{
????????before?
=?DateTime.Now;
????????Pointer.iterate(?data?);
????????total?
+=?DateTime.Now?-?before;
??????}

??????seconds?
=?total.Seconds?+?(?total.Milliseconds?/?1000.0?);
??????System.Console.WriteLine(?
"Pointer?Math:?\t\t"?+?seconds?+?"?seconds"?);
????}

????}

}

posted on 2006-04-14 12:50 夢在天涯 閱讀(370) 評論(0)  編輯 收藏 引用 所屬分類: C#/.NET

公告

EMail:itech001#126.com

導航

統計

  • 隨筆 - 461
  • 文章 - 4
  • 評論 - 746
  • 引用 - 0

常用鏈接

隨筆分類

隨筆檔案

收藏夾

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

積分與排名

  • 積分 - 1818996
  • 排名 - 5

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              亚洲欧美国产日韩中文字幕| 国产精品99久久久久久人| 欧美视频精品在线| 欧美成人黑人xx视频免费观看| 欧美午夜女人视频在线| 欧美成人综合一区| 国产人久久人人人人爽| 宅男精品导航| 99re热这里只有精品视频| 久久九九免费| 久久精品亚洲一区| 欧美性一区二区| 亚洲精品乱码久久久久久| 激情欧美国产欧美| 欧美影视一区| 久久国产精品第一页| 欧美午夜精品电影| 一区二区三区av| 亚洲深夜激情| 欧美日韩综合视频网址| 亚洲黄色毛片| 亚洲日本欧美| 欧美xx69| 亚洲高清视频在线观看| 亚洲日本黄色| 免费观看国产成人| 亚洲国产欧美日韩| 亚洲精品一级| 欧美激情视频一区二区三区不卡| 欧美粗暴jizz性欧美20| 在线观看一区视频| 可以看av的网站久久看| 欧美a级片网站| 亚洲国产专区| 欧美精品电影| 亚洲素人一区二区| 欧美在线观看你懂的| 国产精品一区二区欧美| 久久本道综合色狠狠五月| 久久精品一区中文字幕| 精品88久久久久88久久久| 久久免费视频在线| 亚洲大胆视频| 在线视频欧美日韩| 国产精品国产三级欧美二区| 亚洲欧美精品伊人久久| 久久精彩视频| 亚洲电影第三页| 欧美成人高清| 亚洲视频第一页| 久久午夜羞羞影院免费观看| 91久久久亚洲精品| 欧美日韩视频在线第一区| 亚洲欧美日韩国产一区二区三区| 久久免费一区| 日韩一级成人av| 国产精品一二三四区| 久久午夜激情| 亚洲一二区在线| 欧美v日韩v国产v| 亚洲在线播放| 激情综合视频| 欧美视频第二页| 久久久一区二区| 亚洲伦伦在线| 猫咪成人在线观看| 亚洲午夜精品在线| 韩国精品一区二区三区| 欧美日韩在线播| 久久手机免费观看| 亚洲午夜在线观看| 亚洲国产精品久久久久秋霞不卡| 午夜亚洲福利| 夜久久久久久| 樱花yy私人影院亚洲| 国产精品久久久久久久久久三级| 美女脱光内衣内裤视频久久网站| 亚洲一区视频| 日韩视频一区二区在线观看| 久久婷婷国产综合国色天香| 亚洲视频一二三| 亚洲人成小说网站色在线| 国产综合18久久久久久| 欧美日韩亚洲激情| 欧美r片在线| 久久se精品一区精品二区| 一本一本久久a久久精品综合妖精| 久久先锋资源| 亚洲伦伦在线| 国产精品久久久久aaaa樱花 | 国产一区再线| 国产精品成人一区| 久久综合色88| 久久国产精品一区二区三区| 亚洲人精品午夜| 久久一区欧美| 亚洲男女自偷自拍图片另类| 亚洲国产精品久久人人爱蜜臀 | 亚洲国产精品福利| 国产精品麻豆欧美日韩ww| 美女视频网站黄色亚洲| 一区二区三区日韩精品视频| 亚洲激情偷拍| 欧美激情精品| 你懂的网址国产 欧美| 欧美一区二区在线视频| 亚洲视频久久| 一区二区三区不卡视频在线观看| 亚洲欧洲一区二区在线观看| 在线成人av.com| 好看的日韩视频| 国产日韩欧美二区| 国产精品欧美精品| 欧美色网一区二区| 欧美日韩国产黄| 久久免费视频观看| 久久精品一区二区三区不卡| 亚洲免费在线看| 亚洲一区二区三区精品在线观看| 一本色道久久综合亚洲精品婷婷 | 亚洲午夜在线观看视频在线| 亚洲国产一区二区三区在线播 | 国产欧美在线视频| 国产精品激情| 欧美午夜免费| 国产人成精品一区二区三| 国产精品久久久久久影视 | 亚洲精品之草原avav久久| 在线观看国产精品淫| 国产亚洲欧美aaaa| 亚洲国产精品久久人人爱蜜臀| 狠狠色丁香婷婷综合| 黄色免费成人| 亚洲国产精品成人久久综合一区| 亚洲激情欧美激情| 亚洲人成毛片在线播放| 亚洲国产精品传媒在线观看| 一本色道久久| 西瓜成人精品人成网站| 久久久久久久久久看片| 久久婷婷国产综合精品青草| 欧美成人四级电影| 久久青草久久| 日韩午夜中文字幕| 亚洲一区二区三区高清| 久久成人国产精品| 欧美成人精品在线播放| 欧美日韩国产成人高清视频| 欧美日韩在线直播| 国内成+人亚洲| 亚洲欧洲久久| 午夜视频在线观看一区二区三区| 久久精品欧美| 亚洲国产欧美一区二区三区久久 | 亚洲乱码国产乱码精品精| 中文一区二区| 久久青青草原一区二区| 亚洲精品乱码久久久久久久久| 亚洲无线观看| 欧美成人官网二区| 国产一区三区三区| 亚洲精品欧美| 欧美在线视频一区二区三区| 免费中文日韩| 亚洲综合成人婷婷小说| 美女诱惑黄网站一区| 国产日韩欧美一区二区三区在线观看 | 亚洲视频导航| 老司机成人网| 国产免费观看久久| 一区二区三区视频在线| 免费精品视频| 亚洲欧美日韩精品久久奇米色影视| 久久精品一区二区三区不卡| 欧美日韩免费一区二区三区视频 | 国产精品入口夜色视频大尺度| 樱桃国产成人精品视频| 亚洲欧美制服另类日韩| 欧美88av| 麻豆精品网站| 国产一级揄自揄精品视频| 一区二区三区产品免费精品久久75| 久久久久国产一区二区三区四区| 亚洲片在线观看| 久久一区二区精品| 国产精品久久久久久久久果冻传媒 | 久久久久国产一区二区三区| 一本久久a久久精品亚洲| 模特精品在线| 永久555www成人免费| 久久aⅴ国产欧美74aaa| 亚洲国产精品久久人人爱蜜臀 | 国产伦精品一区二区三区在线观看| 日韩一级精品| 欧美激情网站在线观看| 久久国产黑丝| 国产精品成人免费视频 | 最新中文字幕一区二区三区| 久久精品国产欧美激情| 国产欧美欧美|