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

隨筆-341  評論-2670  文章-0  trackbacks-0
    Lazy Compiler使用Syngram動態創建語法分析器的代碼實在是太慢了,debug竟然需要8秒鐘來處理91條比較長的文法。于是我打開了Visual Studio 2008的Performance Wizard查看運行時消耗的資源,結果發現竟然都消耗在自己那個array類的operator[]里面了。那一段代碼是用來檢查文法的左遞歸引用關系是否出現環的。結果就把用到的四個array全部換成bool*了,當時只是為了創建二維數組方便使用了array類。

    過后,debug的時間立刻降為2秒鐘不到,于是我又打開Performance Wizard看了一次,這次消耗的瓶頸終于轉移到一個合理的地方了。

    結果:array竟然比指針慢了無窮多倍,得找個時候重新寫一次。不過這段代碼好象是去年寫的,也沒經過什么性能測試,也難怪發現不了問題。在此帖上代碼,等Lazy Script寫完了重新審查一下自己的那套模板庫(NTL,Non-standard Template Library,娃哈哈)。
  1     enum VLE_ArrayCommander
  2     {
  3         vacNewArray
  4     };
  5 
  6     template<VLE_ArrayCommander _Commander , VInt _Dims>
  7     class VL_ArrayDimension : public VL_Base
  8     {
  9     public:
 10         VInt    Dims[_Dims+1];
 11 
 12         VL_ArrayDimension()
 13         {
 14             for(VInt i=0;i<_Dims;i++)
 15             {
 16                 Dims[i]=0;
 17             }
 18         }
 19 
 20         VL_ArrayDimension(VInt Dim , VInt* PrevDims)
 21         {
 22             Dims[0]=Dim;
 23             memcpy(Dims+1,PrevDims,sizeof(VInt)*(_Dims-1));
 24         }
 25 
 26         VL_ArrayDimension<_Commander , _Dims+1> operator [](VInt Dim)
 27         {
 28             return VL_ArrayDimension<_Commander , _Dims+1>(Dim,Dims);
 29         }
 30 
 31         VInt GetSize()
 32         {
 33             VInt Size=1;
 34             for(VInt i=0;i<_Dims;i++)
 35             {
 36                 Size*=Dims[i];
 37             }
 38             return Size;
 39         }
 40     };
 41 
 42     extern VL_ArrayDimension<vacNewArray , 0> NewArray;
 43 
 44     template<typename _Type>
 45     class VL_ArrayInfo : public VL_Base
 46     {
 47     public:
 48         _Type*    Elements;
 49         VInt*    Dims;
 50         VInt    RefCount;
 51         VInt    Size;
 52 
 53         VL_ArrayInfo(VInt aDims)
 54         {
 55             Dims=new VInt[aDims];
 56         }
 57 
 58         ~VL_ArrayInfo()
 59         {
 60             delete[] Dims;
 61         }
 62     };
 63 
 64     template<typename _Type , VInt _Dims>
 65     class VL_Array : public VL_Base
 66     {
 67     protected:
 68 
 69     public:
 70 
 71         template<VInt _RefDims>
 72         class VL_ArrayReference : public VL_Base
 73         {
 74             friend class VL_Array;
 75         protected:
 76             VL_ArrayInfo<_Type>*    FInfo;
 77             _Type*                    FElements;
 78             VInt                    FSubSize;
 79         public:
 80 
 81             VL_ArrayReference(_Type* Elements , VL_ArrayInfo<_Type>* Info , VInt Dim)
 82             {
 83                 FInfo=Info;
 84                 FSubSize=FInfo->Size/FInfo->Dims[_RefDims];
 85                 FElements=Elements+Dim*FSubSize;
 86             }
 87 
 88             VL_ArrayReference(VL_ArrayInfo<_Type>* Info , _Type* Elements , VInt SubSize)
 89             {
 90                 FInfo=Info;
 91                 FElements=Elements;
 92                 FSubSize=SubSize;
 93             }
 94 
 95             VL_ArrayReference<_RefDims-1> operator [](VInt Dim)
 96             {
 97                 VInt SubSize=FSubSize/FInfo->Dims[_RefDims-1];
 98                 return VL_ArrayReference<_RefDims-1>(FInfo,FElements+Dim*SubSize,SubSize);
 99             }
100 
101             operator VL_Array<_Type , _RefDims>()
102             {
103                 return VL_Array<_Type , _Dims-1>(FInfo,FElements);
104             }
105 
106             VL_Array<_Type , _RefDims> Reference()
107             {
108                 return VL_Array<_Type , _Dims-1>(FInfo,FElements);
109             }
110 
111             VL_Array<_Type , _RefDims> Clone()
112             {
113                 return VL_Array<_Type , _Dims-1>(FInfo,FElements).Clone();
114             }
115 
116             void Copy(VL_Array<_Type , _RefDims>& Array)
117             {
118                 VL_ArrayInfo<_Type>* ArrayInfo=Array.GetInfo();
119                 VInt Count=FInfo->Dims[_RefDims-1];
120                 if(Count>ArrayInfo->Dims[_RefDims-1])
121                 {
122                     Count=ArrayInfo->Dims[_RefDims-1];
123                 }
124                 for(VInt i=0;i<Count;i++)
125                 {
126                     operator [](i).Copy(Array[i].Reference());
127                 }
128             }
129 
130             VInt GetCount()
131             {
132                 return FInfo->Dims[_RefDims-1];
133             }
134         };
135 
136         template<>
137         class VL_ArrayReference<1> : public VL_Base
138         {
139         protected:
140             VL_ArrayInfo<_Type>*    FInfo;
141             _Type*                    FElements;
142         public:
143 
144             VL_ArrayReference(_Type* Elements , VL_ArrayInfo<_Type>* Info , VInt Dim)
145             {
146                 FInfo=Info;
147                 FElements=Elements+Dim*FInfo->Size/FInfo->Dims[1];
148             }
149 
150             VL_ArrayReference(VL_ArrayInfo<_Type>* Info , _Type* Elements , VInt SubSize)
151             {
152                 FInfo=Info;
153                 FElements=Elements;
154             }
155 
156             _Type& operator [](VInt Dim)
157             {
158                 return FElements[Dim];
159             }
160 
161             operator VL_Array<_Type , 1>()
162             {
163                 return VL_Array<_Type , 1>(FInfo,FElements);
164             }
165 
166             VL_Array<_Type , 1> Reference()
167             {
168                 return VL_Array<_Type , 1>(FInfo,FElements);
169             }
170 
171             VL_Array<_Type , 1> Clone()
172             {
173                 return VL_Array<_Type , 1>(FInfo,FElements).Clone();
174             }
175 
176             void Copy(VL_Array<_Type , 1>& Array)
177             {
178                 VL_ArrayInfo<_Type>* ArrayInfo=Array.GetInfo();
179                 _Type* ArrayElements=Array.GetElements();
180                 VInt Count=FInfo->Dims[0];
181                 if(Count>ArrayInfo->Dims[0])
182                 {
183                     Count=ArrayInfo->Dims[0];
184                 }
185                 for(VInt i=0;i<Count;i++)
186                 {
187                     FElements[i]=ArrayElements[i];
188                 }
189             }
190 
191             VInt GetCount()
192             {
193                 return FInfo->Dims[0];
194             }
195         };
196 
197     protected:
198         VL_ArrayInfo<_Type>*    FInfo;
199         _Type*                    FElements;
200 
201         void Create(VInt Size)
202         {
203             FInfo=new VL_ArrayInfo<_Type>(_Dims);
204             FInfo->Elements=new _Type[Size];
205             FInfo->RefCount=1;
206             FInfo->Size=Size;
207             if(Size==0)
208             {
209                 for(VInt i=0;i<_Dims;i++)
210                 {
211                     FInfo->Dims[i]=0;
212                 }
213             }
214             FElements=FInfo->Elements;
215         }
216 
217         void Inc()
218         {
219             FInfo->RefCount++;
220         }
221 
222         void Dec()
223         {
224             if(!--FInfo->RefCount)
225             {
226                 delete[] FInfo->Elements;
227                 delete FInfo;
228                 FInfo=0;
229                 FElements=0;
230             }
231         }
232 
233         VL_Array(VInt Size)
234         {
235             Create(Size);
236         }
237 
238     public:
239 
240         VL_Array()
241         {
242             Create(0);
243         }
244 
245         VL_Array(VL_ArrayInfo<_Type>* Info , _Type* Elements)
246         {
247             FInfo=Info;
248             FElements=Elements;
249             Inc();
250         }
251 
252         VL_Array(VL_ArrayDimension<vacNewArray , _Dims>& Dims)
253         {
254             Create(Dims.GetSize());
255             memcpy(FInfo->Dims,Dims.Dims,sizeof(VInt)*_Dims);
256         }
257 
258         ~VL_Array()
259         {
260             Dec();
261         }
262 
263         VL_Array(VL_Array<_Type , _Dims>& Array)
264         {
265             FInfo=Array.FInfo;
266             FElements=Array.FElements;
267             Inc();
268         }
269 
270         VL_Array<_Type , _Dims>& operator =(VL_Array<_Type , _Dims>& Array)
271         {
272             Dec();
273             FInfo=Array.FInfo;
274             FElements=Array.FElements;
275             Inc();
276             return *this;
277         }
278 
279         VL_ArrayReference<_Dims-1> operator [](VInt Dim)
280         {
281             return VL_ArrayReference<_Dims-1>(FElements,FInfo,Dim);
282         }
283 
284         VL_Array<_Type , _Dims> Reference()
285         {
286             return *this;
287         }
288 
289         VL_Array<_Type , _Dims> Clone()
290         {
291             VL_Array<_Type , _Dims> Array(FInfo->Size);
292             for(VInt i=0;i<FInfo->Size;i++)
293             {
294                 Array.FElements[i]=FElements[i];
295             }
296             memcpy(Array.FInfo->Dims,FInfo->Dims,sizeof(VInt)*_Dims);
297             return Array;
298         };
299 
300         void Copy(VL_Array<_Type , _Dims>& Array)
301         {
302             operator =(Array.Clone());
303         }
304 
305         VL_ArrayInfo<_Type>* GetInfo()
306         {
307             return FInfo;
308         }
309 
310         _Type* GetElements()
311         {
312             return FElements;
313         }
314 
315         VInt GetCount()
316         {
317             return FInfo->Dims[_Dims-1];
318         }
319     };
320 
321     template<typename _Type>
322     class VL_Array<_Type , 1> : public VL_Base
323     {
324     protected:
325         VL_ArrayInfo<_Type>*    FInfo;
326         _Type*                    FElements;
327 
328         void Create(VInt Size)
329         {
330             FInfo=new VL_ArrayInfo<_Type>(1);
331             FInfo->Elements=new _Type[Size];
332             FInfo->RefCount=1;
333             FInfo->Size=Size;
334             FInfo->Dims[0]=0;
335             FElements=FInfo->Elements;
336         }
337 
338         void Inc()
339         {
340             FInfo->RefCount++;
341         }
342 
343         void Dec()
344         {
345             if(!--FInfo->RefCount)
346             {
347                 delete[] FInfo->Elements;
348                 delete FInfo;
349                 FInfo=0;
350                 FElements=0;
351             }
352         }
353 
354         VL_Array(VInt Size)
355         {
356             Create(Size);
357         }
358 
359     public:
360 
361         VL_Array()
362         {
363             Create(0);
364         }
365 
366         VL_Array(VL_ArrayInfo<_Type>* Info , _Type* Elements)
367         {
368             FInfo=Info;
369             FElements=Elements;
370             Inc();
371         }
372 
373         VL_Array(VL_ArrayDimension<vacNewArray , 1>& Dims)
374         {
375             Create(Dims.GetSize());
376             FInfo->Dims[0]=Dims.Dims[0];
377         }
378 
379         ~VL_Array()
380         {
381             Dec();
382         }
383 
384         VL_Array(VL_Array<_Type , 1>& Array)
385         {
386             FInfo=Array.FInfo;
387             FElements=Array.FElements;
388             Inc();
389         }
390 
391         VL_Array<_Type , 1>& operator =(VL_Array<_Type , 1>& Array)
392         {
393             Dec();
394             FInfo=Array.FInfo;
395             FElements=Array.FElements;
396             Inc();
397             return *this;
398         }
399 
400         _Type& operator [](VInt Dim)
401         {
402             return FInfo->Elements[Dim];
403         }
404 
405         VL_Array<_Type , 1> Reference()
406         {
407             return *this;
408         }
409 
410         VL_Array<_Type , 1> Clone()
411         {
412             VL_Array<_Type , 1> Array(FInfo->Size);
413             for(VInt i=0;i<FInfo->Size;i++)
414             {
415                 Array.FInfo->Elements[i]=FInfo->Elements[i];
416             }
417             return Array;
418         };
419 
420         void Copy(VL_Array<_Type , 1>& Array)
421         {
422             operator =(Array.Clone());
423         }
424 
425         VL_ArrayInfo<_Type>* GetInfo()
426         {
427             return FInfo;
428         }
429 
430         _Type* GetElements()
431         {
432             return FElements;
433         }
434 
435         VInt GetCount()
436         {
437             return FInfo->Dims[0];
438         }
439     };
posted on 2008-04-27 19:53 陳梓瀚(vczh) 閱讀(2642) 評論(6)  編輯 收藏 引用 所屬分類: C++

評論:
# re: 今天發現自己的array類太慢 2008-04-27 20:06 | 空明流轉
Release的照理沒那么慢。  回復  更多評論
  
# re: 今天發現自己的array類太慢 2008-04-27 23:35 | 陳梓瀚(vczh)
release只少了1/3,debug對array::operator[]加了太多東西了……  回復  更多評論
  
# re: 今天發現自己的array類太慢 2008-06-02 00:20 | suxiaojack
還是C的void*實現的任意類型的模板比較爽。速度最快。不同類型,不過是元素大小不同而已。  回復  更多評論
  
# re: 今天發現自己的array類太慢 2008-06-02 10:00 | 陳梓瀚(vczh)
void*的話為了把你需要的大于sizeof(void*)的東西放進去,你將不得不malloc/free很多次,除非你有對象池,否則將在這里吃掉大量性能。  回復  更多評論
  
# re: 今天發現自己的array類太慢 2008-07-24 09:24 | jetricy
也難怪,雖然用了內聯,但是這個operator[]的指令數數10倍于尋址運算了.
另外記得inline優化要在release中才有,N次尋址加上2次壓棧退棧,檢查棧操作,也就難怪了.  回復  更多評論
  
# re: 今天發現自己的array類太慢 2009-08-03 16:47 | zdhsoft
你的數組copy存在bug,當自己copy自己的時候,會出現!  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            美女主播视频一区| 亚洲电影免费观看高清完整版在线观看 | 91久久久亚洲精品| 国产精品成人v| 媚黑女一区二区| 欧美好骚综合网| 欧美一区二区三区在线观看| 亚洲午夜在线观看| 亚洲综合首页| 久久久久久久久久久成人| 久久精品国产一区二区三| 欧美精品三级| 国产精品久久久久久久久久久久| 欧美国产91| 国产精品狠色婷| 黄色一区二区三区| 亚洲精品久久久久久一区二区 | 国产日本欧美在线观看| 国产亚洲va综合人人澡精品| 国产亚洲欧美日韩一区二区| 亚洲第一天堂无码专区| 亚洲一区中文| 亚洲黄色天堂| 久久人体大胆视频| 国产欧美综合一区二区三区| 在线观看日韩av先锋影音电影院| 在线观看成人小视频| 99这里只有久久精品视频| 久久久久国产一区二区| 欧美日韩国产天堂| 亚洲第一主播视频| 亚洲一区二区视频| 日韩视频一区二区| 麻豆精品在线视频| 欧美激情视频网站| 欧美激情视频一区二区三区免费 | 欧美亚洲三级| 好看的av在线不卡观看| 久久噜噜亚洲综合| 久久久免费精品| 亚洲高清不卡av| 亚洲国产日韩欧美综合久久| 欧美日本簧片| 香蕉av777xxx色综合一区| 欧美一区二区精品| 亚洲乱码视频| 亚洲一区二区三区久久| 国产亚洲欧美一级| 99国产精品视频免费观看| 国产亚洲高清视频| 日韩亚洲视频在线| 在线观看欧美激情| 一区二区激情| 亚洲精品免费在线播放| 久久成人精品无人区| 一个色综合av| 欧美福利在线观看| 性色一区二区三区| 欧美极品一区| 欧美成人精品福利| 国产综合久久| 亚洲色在线视频| 亚洲一区二区三区精品在线| 免播放器亚洲一区| 蜜臀av性久久久久蜜臀aⅴ| 国产欧美视频一区二区| 日韩一二三在线视频播| 免费不卡中文字幕视频| 亚洲一区二区网站| 欧美精品在线视频观看| 久久婷婷国产综合尤物精品| 欧美伦理影院| 亚洲精品欧洲| 亚洲午夜久久久久久尤物| 欧美日韩亚洲国产精品| 一本色道久久加勒比88综合| 亚洲美女视频网| 欧美日韩在线看| 99精品欧美| 久久精品亚洲一区| 99在线热播精品免费| 亚洲欧美日本另类| 影音先锋欧美精品| 欧美伦理a级免费电影| 亚洲午夜一区二区| 久久一区精品| 亚洲自拍都市欧美小说| 国产日韩欧美二区| 欧美国产欧美综合| 亚洲视频专区在线| 免费试看一区| 欧美亚洲一区二区在线| 亚洲精品视频免费| 国产一区二区三区丝袜| 欧美日韩激情小视频| 亚洲欧美一级二级三级| 欧美激情日韩| 老司机一区二区三区| 欧美视频免费| 久久久久国产精品一区二区| 一本一本久久| 亚洲高清成人| 亚洲大片在线| 麻豆精品91| 欧美激情在线狂野欧美精品| 久久精品国产久精国产思思| 免费观看30秒视频久久| 久久综合狠狠综合久久激情| 久久精品2019中文字幕| 亚洲日韩视频| 亚洲美女黄网| 一区二区三区精品国产| 亚洲精品欧美| 最新精品在线| 99精品久久免费看蜜臀剧情介绍| 在线播放不卡| 亚洲人成高清| 亚洲网站在线看| 欧美一区网站| 久久亚洲风情| 亚洲第一在线综合在线| 亚洲国产成人精品久久久国产成人一区 | 欧美视频一区二区三区| 国产精品久久久久免费a∨大胸 | 西瓜成人精品人成网站| 久久久99国产精品免费| 亚洲国产美女| 亚洲欧美一区二区三区极速播放| 久久亚洲国产精品日日av夜夜| 欧美成人午夜激情在线| 国产精品一级二级三级| 狠狠色综合色区| 香蕉成人伊视频在线观看| 美女视频一区免费观看| 久久国产精品99精品国产| 国产精品午夜电影| 久久成人免费日本黄色| 香蕉久久夜色精品| 亚洲第一页自拍| 黄色成人免费观看| 欧美揉bbbbb揉bbbbb| 极品少妇一区二区| 欧美视频亚洲视频| 欧美与黑人午夜性猛交久久久| 欧美亚洲一区二区三区| 国产亚洲免费的视频看| 久热精品视频在线观看一区| 久久久水蜜桃| 日韩亚洲欧美成人一区| 亚洲一区二区伦理| 亚洲国产精品一区二区第四页av| 亚洲电影欧美电影有声小说| 亚洲精品综合| 欧美一区二区三区四区在线观看| 欧美成人精品高清在线播放| 国产有码在线一区二区视频| 欧美一区二区免费视频| 一区二区三区日韩| 国产精品久久一区二区三区| 亚洲一区区二区| 亚洲欧美日韩在线高清直播| 国产精品一区二区a| 久久不见久久见免费视频1| 久久精品论坛| 日韩午夜激情电影| 亚洲自拍三区| 亚洲国产欧美一区二区三区久久| 欧美黄色片免费观看| 欧美日韩日本国产亚洲在线 | 欧美成人在线免费视频| 韩国精品主播一区二区在线观看| 久久阴道视频| 欧美日韩精品不卡| 新67194成人永久网站| 久久国产天堂福利天堂| 亚洲日本欧美天堂| 欧美一区二区精品在线| 中文一区二区| 蜜臀久久99精品久久久久久9| 亚洲性视频h| 欧美精品v日韩精品v韩国精品v | 亚洲高清视频一区| 午夜精品视频在线观看| 国产亚洲女人久久久久毛片| 欧美国产日韩xxxxx| 国产一区二区久久精品| 日韩午夜电影在线观看| 亚洲国产高清aⅴ视频| 久久大逼视频| 免费中文日韩| 亚洲成人在线免费| 久久亚洲风情| 欧美电影免费观看高清| 国内自拍一区| 久久夜色精品| 亚洲激情视频在线| 在线性视频日韩欧美| 欧美国产精品一区| av成人毛片| 久久久中精品2020中文|