• <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>

            woaidongmao

            文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
            數(shù)據(jù)加載中……

            對Berkeley DB的性能進(jìn)行的部分測試

             

             環(huán)境說明:

                所有的數(shù)據(jù)插入的都是Key=int,Value=int,在循環(huán)中遞增的.

                本機NTFS的默認(rèn)簇大小為4K.

                本機配置僅僅影響絕對值.相對值是可比較的:

                    OS=WinXP SP2;RAM=1G;CPU=AMD Athlon 64 X2 Dual 5000+;Disk=160G 

                測試的實際數(shù)據(jù)量為:300*10000*2*sizeof(int)/1024/1024~=22.89MByte

                下面所有的測試結(jié)果的單位都是秒.

                編譯器:C++ builder 6.0(使用bcb編譯BDB源碼,形成LIB庫后,直接鏈接到測試程序中.沒有測試DLL的形式.)

                BDB版本:4.6.21.NC

             

              測試頁尺寸對讀寫性能的影響:

                記錄數(shù)量 =300 緩存尺寸=0M

            讀寫\頁尺寸

            1K

            2K

            4K

            8K

            16K

            32K

            B+

            94.94

            84.83

            82.73

            97.16

            142.67

            232.11

            HASH

            346.16

            320.41

            288.36

            295.19

            599.66

            867.03

            B+

            4.22

            4.06

            3.86

            3.91

            3.80

            3.78

            HASH

            8.25

            7.94

            5.42

            5.41

            4.99

            4.88

            結(jié)論:頁尺寸與文件系統(tǒng)的簇大小相同時,寫入性能最佳,讀取性能中等.

            0M緩存的時候,B+的性能要比HASH好得多.

             

             

              測試cache緩存大小對讀寫性能的影響:

                記錄數(shù)量=300  頁尺寸=4K   真實數(shù)據(jù)量=22.89MByte 數(shù)據(jù)庫文件大小=80M

            讀寫\緩存

            0M

            10M

            20M

            40M

            80M

            160M

            320M

            B+

            85.06

            88.66

            133.31

            164.81

            15.31 

            15.34

            15.27

            HASH

            292.91

            224.47

            180.76

            95.28

            20.11

            20.06

            20.05

            B+

            3.98

            4.17

            4.86

            9.56

            3.83 

            3.81

            3.80

            HASH

            5.53

            5.83

            5.83

            8.16

            5.20

            5.08

            5.16

             

                記錄數(shù)量=600  頁尺寸=4K   真實數(shù)據(jù)量=45.78MByte 數(shù)據(jù)庫文件大小=160M

            讀寫\緩存

            0M

            40M

            80M

            160M

            320M

            B+

            259.39

            1198.27

            1017.94

            34.59 

            34.30 

            HASH

            1889.32

            1279.95

            563.12

            40.67

            40.89

            B+

            7.89

            14.02

            22.84

            7.97 

            8.03 

            HASH

            11.17

            16.81

            11.66

            10.39

            10.88

             

            結(jié)論:

                對于緩存大于數(shù)據(jù)庫文件尺寸的時候,沒有太多可說的,操作都在內(nèi)存中,速度非常快

                對于大數(shù)據(jù)量的讀取,兩組對比都比較清晰的說明了一點:緩存的大小對讀取記錄的性能影響不是很大.

                對于大數(shù)據(jù)量的寫入,緩存對性能的影響就非常可觀了,基本可以肯定的是,HASH庫緩存越大寫入速度越快而奇怪的是,B+庫在緩存不足的時候,性能反而比0緩存時還要差很多!!

                總的來說,在我的這些測試中,B+HASH數(shù)據(jù)庫的性能差異很大.

                對于緩存大于物理內(nèi)存的情況未做測試,估計對性能不會有好的影響,畢竟在這種情況下,效率的瓶頸都是在磁盤的IO.

            測試的核心代碼如下:

             

            Cpp代碼 clip_image001 clip_image003clip_image004

            1. #include <db_cxx.h>  
            2. #define DATABASE    "access.db"  
            3. //tcount=記錄數(shù)為多少萬次,DbType=數(shù)據(jù)庫類型,psize=頁尺寸K,csize=緩存尺寸M  
            4. void run(int tcount,DBTYPE DbType,size_t psize,size_t csize)  
            5. {  
            6.     remove(DATABASE);  
            7.     Db db(0, 0);  
            8.  
            9.     db.set_errpfx("AccessExample");  
            10.     db.set_pagesize(1024*psize);  
            11.     db.set_cachesize(0, 1024*1024*csize, 0);  
            12.     db.open(NULL, DATABASE, NULL, DbType, DB_CREATE|DB_THREAD, 0664);  
            13.  
            14.     int testcount=10000*tcount;  
            15.     size_t tick1=GetTickCount();  
            16.     for (int i=0;i<testcount;i++)  
            17.     {  
            18.         Dbt key(&i,sizeof(int));  
            19.         Dbt data(&i,sizeof(int));  
            20.         db.put(0, &key, &data, DB_NOOVERWRITE);  
            21.     }  
            22.       
            23.     printf("插入結(jié)束 %d 萬記錄,全部用時:%.2f\r\n",tcount,(GetTickCount()-tick1)/(float)1000);  
            24.     tick1=GetTickCount();  
            25.     try 
            26.     {  
            27.         Dbc *dbcp;  
            28.         db.cursor(NULL, &dbcp, 0);  
            29.         Dbt key;  
            30.         Dbt data;  
            31.         while (dbcp->get(&key, &data, DB_NEXT) == 0)  
            32.         {  
            33.             key.get_data();  
            34.             data.get_data();  
            35.         }  
            36.         dbcp->close();  
            37.         printf("遍歷結(jié)束 %d 萬記錄,全部用時:%.2f\r\n",tcount,(GetTickCount()-tick1)/(float)1000);  
            38.         db.sync(0);  
            39.     }  
            40.     catch (DbException &dbe) {}  
            41.     db.close(0);  
            #include <db_cxx.h>
            #define DATABASE "access.db"
            //tcount=記錄數(shù)為多少萬次,DbType=數(shù)據(jù)庫類型,psize=頁尺寸K,csize=緩存尺寸M
            void run(int tcount,DBTYPE DbType,size_t psize,size_t csize)
            {
             remove(DATABASE);
             Db db(0, 0);
             
             db.set_errpfx("AccessExample");
             db.set_pagesize(1024*psize);
             db.set_cachesize(0, 1024*1024*csize, 0);
             db.open(NULL, DATABASE, NULL, DbType, DB_CREATE|DB_THREAD, 0664);
             
                int testcount=10000*tcount;
                size_t tick1=GetTickCount();
             for (int i=0;i<testcount;i++)
                {
              Dbt key(&i,sizeof(int));
              Dbt data(&i,sizeof(int));
              db.put(0, &key, &data, DB_NOOVERWRITE);
                }
                
                printf("插入結(jié)束 %d 萬記錄,全部用時:%.2f\r\n",tcount,(GetTickCount()-tick1)/(float)1000);
                tick1=GetTickCount();
             try
                {
              Dbc *dbcp;
              db.cursor(NULL, &dbcp, 0);
              Dbt key;
              Dbt data;
              while (dbcp->get(&key, &data, DB_NEXT) == 0)
                    {
               key.get_data();
               data.get_data();
              }
              dbcp->close();
                    printf("遍歷結(jié)束 %d 萬記錄,全部用時:%.2f\r\n",tcount,(GetTickCount()-tick1)/(float)1000);
                    db.sync(0);
             }
             catch (DbException &dbe) {}
             db.close(0);
            }

             

            分享到: clip_image005clip_image006

            關(guān)于一些中文分詞器

            評論

            4 h_rain 2009-02-22  

            結(jié)論:頁尺寸與文件系統(tǒng)的簇大小相同時,寫入性能最佳,讀取性能中等.

            緩存用盡后,性能的瓶頸就在于磁盤IO.
            BDB
            內(nèi)部對IO進(jìn)行了優(yōu)化,每次操作都是對"頁尺寸"字節(jié)進(jìn)行處理,就是說,讀寫10字節(jié)或100字節(jié)的時候,其實都是在"頁尺寸"這么大的內(nèi)存上進(jìn)行讀寫,之后一次性將一個頁寫入磁盤.你給定的頁尺寸是8k,ntfs默認(rèn)的""大小是4k,所以這樣的操作要跨簇進(jìn)行,效率就低了.

            建議根據(jù)文件系統(tǒng)的""大小設(shè)置BDB"頁尺寸".
            這樣的話,耗時基本是定長的了.

            3 peter_wu 2009-02-20  

            觀察任務(wù)管理器,發(fā)現(xiàn)速度快的時候,cache還沒有用完,沒有IO操作。當(dāng)內(nèi)存不再增長,cache用完的時候,IO開始大量讀取和寫入,速度開始下降。原來如此啊。

            2 peter_wu 2009-02-20  

            插入一個周期,10w 用時 0.00
            插入一個周期,10w 用時 0.92
            插入一個周期,10w 用時 1.09
            插入一個周期,10w 用時 1.11
            插入一個周期,10w 用時 1.14
            插入一個周期,10w 用時 1.16
            插入一個周期,10w 用時 1.19
            插入一個周期,10w 用時 1.14
            插入一個周期,10w 用時 1.19
            插入一個周期,10w 用時 1.20
            插入一個周期,10w 用時 1.20
            插入一個周期,10w 用時 1.28
            插入一個周期,10w 用時 1.22
            插入一個周期,10w 用時 1.17
            插入一個周期,10w 用時 1.20
            插入一個周期,10w 用時 1.19
            插入一個周期,10w 用時 1.20
            插入一個周期,10w 用時 1.26
            插入一個周期,10w 用時 1.24
            插入一個周期,10w 用時 1.16
            插入一個周期,10w 用時 1.17
            插入一個周期,10w 用時 1.38
            插入一個周期,10w 用時 1.19
            插入一個周期,10w 用時 1.20
            插入一個周期,10w 用時 1.16
            插入一個周期,10w 用時 1.19
            插入一個周期,10w 用時 1.17
            插入一個周期,10w 用時 1.22
            插入一個周期,10w 用時 1.17
            插入一個周期,10w 用時 1.20
            插入一個周期,10w 用時 1.22
            插入一個周期,10w 用時 1.28
            插入一個周期,10w 用時 1.19
            插入一個周期,10w 用時 1.33
            插入一個周期,10w 用時 1.19
            插入一個周期,10w 用時 1.23
            插入一個周期,10w 用時 1.22
            插入一個周期,10w 用時 1.20
            插入一個周期,10w 用時 1.22
            插入一個周期,10w 用時 1.23
            插入一個周期,10w 用時 1.42
            插入一個周期,10w 用時 1.22
            插入一個周期,10w 用時 1.19
            插入一個周期,10w 用時 1.27
            插入一個周期,10w 用時 5.84
            插入一個周期,10w 用時 9.52
            插入一個周期,10w 用時 14.03
            插入一個周期,10w 用時 15.39
            插入一個周期,10w 用時 16.44
            插入一個周期,10w 用時 20.39
            插入結(jié)束 500 萬記錄,全部用時:156.05
            遍歷結(jié)束 500 萬記錄,全部用時:14.11
            請按任意鍵繼續(xù). . .

            1 peter_wu 2009-02-20  

            我改了下代碼,發(fā)現(xiàn)一個問題,隨著時間推移,插入效率下降嚴(yán)重,請問是為什么。

            Java代碼 clip_image001 clip_image003clip_image004

            1. #include <db_cxx.h>    
            2. #include <Windows.h>  
            3. #define DATABASE    "access.db"    
            4. void run(int tcount,DBTYPE DbType,size_t psize,size_t csize)  ;  
            5. void main(int argc,char * argv[])  
            6. {  
            7.     run(500,DB_BTREE,8,100);  
            8. }  
            9.  
            10.  
            11. //tcount=記錄數(shù)為多少萬次,DbType=數(shù)據(jù)庫類型,psize=頁尺寸K,csize=緩存尺寸M    
            12. void run(int tcount,DBTYPE DbType,size_t psize,size_t csize)    
            13. {    
            14.     remove(DATABASE);    
            15.     Db db(0, 0);    
            16.  
            17.     db.set_errpfx("AccessExample");    
            18.     db.set_pagesize(1024*psize);    
            19.     db.set_cachesize(0, 1024*1024*csize, 0);    
            20.     db.open(NULL, DATABASE, NULL, DbType, DB_CREATE|DB_THREAD, 0664);    
            21.  
            22.     int testcount=10000*tcount;    
            23.     size_t tick1=GetTickCount();    
            24.  
            25.     DWORD inlinetick=tick1;  
            26.     for (int i=0;i<testcount;i++)    
            27.     {    
            28.         Dbt key(&i,sizeof(int));    
            29.         Dbt data(&i,sizeof(int));    
            30.         db.put(0, &key, &data, DB_NOOVERWRITE);    
            31.         if (i%100000==0)  
            32.         {  
            33.             printf("插入一個周期,10w 用時 %.2f \n",(GetTickCount()-inlinetick)/(float)1000);  
            34.             inlinetick=GetTickCount();  
            35.         }  
            36.     }    
            37.  
            38.     printf("插入結(jié)束 %d 萬記錄,全部用時:%.2f\r\n",tcount,(GetTickCount()-tick1)/(float)1000);    
            39.     tick1=GetTickCount();    
            40.     try    
            41.     {    
            42.         Dbc *dbcp;    
            43.         db.cursor(NULL, &dbcp, 0);    
            44.         Dbt key;    
            45.         Dbt data;    
            46.         while (dbcp->get(&key, &data, DB_NEXT) == 0)    
            47.         {    
            48.             key.get_data();    
            49.             data.get_data();    
            50.         }    
            51.         dbcp->close();    
            52.         printf("遍歷結(jié)束 %d 萬記錄,全部用時:%.2f\r\n",tcount,(GetTickCount()-tick1)/(float)1000);    
            53.         db.sync(0);    
            54.     }    
            55.     catch (DbException &dbe) {}    
            56.     db.close(0);    
            57. }   

             

            posted on 2011-08-28 16:22 肥仔 閱讀(3832) 評論(0)  編輯 收藏 引用 所屬分類: 數(shù)據(jù)庫

            久久亚洲国产最新网站| 日本加勒比久久精品| 精品久久久久久中文字幕大豆网| 久久无码AV中文出轨人妻| 漂亮人妻被中出中文字幕久久| 久久久久久久91精品免费观看| av色综合久久天堂av色综合在| 久久久久免费精品国产| 欧美大战日韩91综合一区婷婷久久青草| 大香伊人久久精品一区二区| 91精品国产9l久久久久| 久久精品国产欧美日韩| 亚洲人成网亚洲欧洲无码久久| 99国内精品久久久久久久| 久久精品日日躁夜夜躁欧美| 99久久www免费人成精品| 婷婷五月深深久久精品| 久久久精品无码专区不卡| 国产亚洲精品自在久久| 久久人人爽人人爽人人片AV不| 999久久久国产精品| 国产精品久久久久久搜索| 久久亚洲精品国产亚洲老地址 | 伊人 久久 精品| 色综合久久天天综合| 久久亚洲中文字幕精品有坂深雪| 久久久久亚洲AV成人网人人软件| 国内精品伊人久久久久av一坑| 久久久久久久久久久久久久| 青青久久精品国产免费看| 99久久精品免费看国产| 亚洲一区中文字幕久久| 精品免费tv久久久久久久| 久久99国产精品尤物| 久久精品国产2020| 精品综合久久久久久98| 国产成人精品三上悠亚久久 | 亚洲中文字幕久久精品无码喷水| 岛国搬运www久久| 精品综合久久久久久88小说| 久久国产成人|