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

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

搜索

  •  

積分與排名

  • 積分 - 1818983
  • 排名 - 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国产精品久久久久老师| 欧美在线二区| 欧美一区国产二区| 欧美亚韩一区| 一区二区三区蜜桃网| avtt综合网| 欧美精品一区二区精品网 | 亚洲午夜高清视频| 欧美激情自拍| 亚洲国产小视频在线观看| 红桃视频亚洲| 欧美一区二区在线| 久久精品电影| 激情欧美一区二区三区在线观看| 亚洲一级影院| 欧美一区91| 国产人久久人人人人爽| 午夜视频在线观看一区| 久久av老司机精品网站导航| 国产乱肥老妇国产一区二| 亚洲一区二区免费| 午夜精彩视频在线观看不卡| 国产精品社区| 亚洲欧美日韩一区二区三区在线| 欧美在线免费观看视频| 国自产拍偷拍福利精品免费一| 久久久精品视频成人| 久久一二三区| 91久久精品国产91性色tv| 欧美激情精品久久久久久黑人 | 西瓜成人精品人成网站| 欧美中文在线免费| 国内精品一区二区| 麻豆免费精品视频| 亚洲欧洲精品一区二区三区 | 午夜视频一区二区| 国产亚洲精品久| 久久一区二区三区四区| 亚洲人成免费| 亚洲欧美一区二区原创| 国产综合自拍| 欧美区日韩区| 午夜日韩在线| 欧美激情久久久| 亚洲直播在线一区| 国外成人在线| 欧美日韩中文| 久久人人爽人人爽爽久久| 亚洲国产日韩精品| 欧美视频免费在线| 久久久999成人| 99精品欧美一区二区三区综合在线| 亚洲女优在线| 亚洲国产精品免费| 国产精品国产三级国产| 久久久免费精品| 在线亚洲免费| 亚洲国产精品久久| 欧美在线欧美在线| 亚洲毛片在线观看| 国产午夜精品一区理论片飘花| 久久久一本精品99久久精品66| 日韩午夜一区| 蜜臀a∨国产成人精品| 亚洲小说春色综合另类电影| 狠狠网亚洲精品| 国产精品每日更新在线播放网址| 裸体丰满少妇做受久久99精品 | 亚洲欧美日韩网| 亚洲免费av片| 欧美大片免费久久精品三p| 亚洲欧美日韩精品久久奇米色影视 | 久久综合亚州| 午夜精品久久久久久久久久久久| 亚洲全部视频| 免费欧美在线| 久久一区亚洲| 久久国产精品一区二区三区四区| 99在线精品视频在线观看| 激情六月婷婷久久| 国产视频综合在线| 国产精品视频不卡| 欧美日韩国内| 欧美日韩国产首页在线观看| 久久午夜激情| 久久亚洲高清| 久久久伊人欧美| 久久精品国产免费| 久久成人免费视频| 欧美在线视频观看| 欧美一区二区三区男人的天堂 | 亚洲中字在线| 一本久道久久综合婷婷鲸鱼| 亚洲区第一页| 亚洲精品一二三区| 亚洲美女精品一区| 9人人澡人人爽人人精品| 亚洲精品视频一区二区三区| 亚洲日本成人| 亚洲免费精彩视频| 99精品久久久| 国产精品99久久久久久有的能看 | 极品日韩久久| 亚洲深夜影院| 久久久午夜精品| 一本久久综合| 亚洲欧美国产另类| 欧美一区二区视频97| 亚洲国产精品一区二区www| 国产精品ⅴa在线观看h| 免费不卡中文字幕视频| 亚洲欧美一区二区三区极速播放| 亚洲日本精品国产第一区| 久久精品国语| 午夜精品久久久久久久99黑人| 亚洲第一免费播放区| 国产三级欧美三级| 欧美视频一区二| 欧美大片专区| 麻豆精品在线观看| 欧美专区在线播放| 亚洲伊人第一页| 一区二区三区四区精品| 亚洲激情成人网| 欧美成人亚洲成人| 猛男gaygay欧美视频| 久久久久青草大香线综合精品| 亚洲专区国产精品| 亚洲一区二区三区久久| 99av国产精品欲麻豆| 亚洲黄色av| 亚洲国产精品成人精品| 影音先锋成人资源站| 国产自产女人91一区在线观看| 国产精品永久免费观看| 国产精品日本精品| 国产精品欧美日韩久久| 国产精品久久久久婷婷| 国产精品国产三级国产aⅴ入口| 欧美特黄一级大片| 欧美视频一区在线观看| 国产精品美女久久| 国产久一道中文一区| 国产亚洲aⅴaaaaaa毛片| 国产精品推荐精品| 亚洲国产美女久久久久| 极品少妇一区二区三区| 国产精品亚洲综合| 国产精品一区二区三区四区| 国产精品视频自拍| 国产亚洲人成a一在线v站| 国产有码在线一区二区视频| 韩曰欧美视频免费观看| 亚洲国产黄色| 亚洲免费激情| 午夜在线精品偷拍| 久久久国产精彩视频美女艺术照福利 | 久久aⅴ国产紧身牛仔裤| 欧美综合激情网| 欧美搞黄网站| 国产精品久久久999| 国产中文一区二区| 亚洲欧洲日本国产| 亚洲一区国产| 久久青草欧美一区二区三区| 欧美黄色一区| 一区二区三区**美女毛片 | 亚洲国产精品久久久久| 日韩亚洲视频在线| 欧美亚洲视频在线看网址| 免费国产一区二区| 国产精品国产成人国产三级| 尤妮丝一区二区裸体视频| 99re66热这里只有精品4| 欧美一区二区三区喷汁尤物| 蜜桃av噜噜一区| 亚洲日本乱码在线观看| 性欧美超级视频| 欧美日本一区二区高清播放视频| 国产欧美视频一区二区| 亚洲精品一区二区三区福利| 久久精品99| 99在线精品观看| 快she精品国产999| 国产精品综合久久久| 亚洲电影有码| 久久深夜福利免费观看| 在线亚洲成人| 欧美精品在线免费播放| 尤物精品国产第一福利三区|