VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

同分同名次示例
前往頁面 1, 2, 3  下一頁
 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
lygcw9603



註冊時間: 2011-12-25
文章: 126


第 1 樓

發表發表於: 星期一 十一月 06, 2017 9:16 pm    文章主題: 同分同名次示例 引言回覆

代碼:

Create Cursor tt (Bh C(10),Cj N(3),Mc N(7))
=Rand(-1)
For i=1 to 100000
    Insert Into tt (Bh,Cj) Values (Padl(i,10,"0"),Rand()*100)
EndFor
t1=Seconds()
Index On 200-Cj Tag px
nCj=0
nMc=1
nRec=1
Scan
    If Cj!=nCJ
        nMc=nRec
    EndIF
    Replace Mc With nMc
    nRec=nRec+1
    nCj=Cj
    nMc=Mc
EndScan
MessageBox(Transform(Reccount())+" 條記錄共運行:"+Transform(Seconds()-t1,"999.99")+" 秒")
go top
browse


雖然代碼有些多,但該方法是VFP中排名次最快的方法,即使VFP中的SQL命令生成的代碼也不會比這段代碼速度快。
歡迎大家可以生成一些數據測試
回頂端
檢視會員個人資料 發送私人訊息
ckp6250



註冊時間: 2004-07-30
文章: 1642


第 2 樓

發表發表於: 星期一 十一月 06, 2017 10:22 pm    文章主題: 引言回覆

代碼:

Close Databases All
Create CURSOR tt (Bh C(10),Cj N(3),Mc N(7))
=Rand(-1)
For i=1 To 100000
   Insert Into tt (Bh,Cj) Values (Padl(i,10,"0"),Rand()*100)
ENDFOR
nCj=0
nMc=1
nRec=1
SELECT Bh,Cj,GetMc() AS Mc ;
FROM (;
Select Bh,Cj,0000000 AS Mc From tt Order By Cj DESC) a

Function getMc()   
   vRet = 0
   If Cj!=nCj
      nMc=nRec
   Endif
   vRet = nMc
   nRec=nRec+1
   nCj=Cj
   nMc=vRet
   Return MAX(vRet-1,0000001)
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
lygcw9603



註冊時間: 2011-12-25
文章: 126


第 3 樓

發表發表於: 星期二 十一月 07, 2017 2:43 am    文章主題: 引言回覆

100W條記錄:一樓的代碼運行2-3秒;二樓的代碼運行5秒左右
回頂端
檢視會員個人資料 發送私人訊息
ckp6250



註冊時間: 2004-07-30
文章: 1642


第 4 樓

發表發表於: 星期二 十一月 07, 2017 4:49 pm    文章主題: 引言回覆

100萬條記錄時,如果資料來源都是實體硬碟的話,結果會略有不同,
比如,Create Table c:\tt (Bh C(10),Cj N(3),Mc N(7))

1樓的程式,需要寫入硬碟100萬次(Replace Mc With nMc ),效能會大為減低,
2樓則只讀不寫,所以,不管資料來源是 cursor 或實體 table , 效能相差不大

當資料筆數越大,比如1000萬筆或更多,1樓程式會越拖越慢。

兩者各有千秋,您可個別試看看
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
garfield
Site Admin


註冊時間: 2003-01-30
文章: 2157


第 5 樓

發表發表於: 星期二 十一月 07, 2017 5:39 pm    文章主題: 引言回覆

怎麼我的VFP9 執行 ckp6250 的程式比較快呢?
1000 , 10000, 100000 都在1秒內完成.
100W也在 3.17秒完成,
scan的要108.56 秒.
代碼:

Close Databases All
Create CURSOR tt (Bh C(10),Cj N(3),Mc N(7))
=Rand(-1)
For i=1 To 1000000
   Insert Into tt (Bh,Cj) Values (Padl(i,10,"0"),Rand()*100)
ENDFOR

DO test3
do test2


RETURN

FUNCTION test3

t1=Seconds()

nCj=0
nMc=1
nRec=1
SELECT Bh,Cj,GetMc() AS Mc FROM (Select Bh,Cj,00000000 AS Mc From tt Order By Cj DESC) a  into cursor zz
? 'SQL',Transform(Reccount())+" 條記錄共運行:"+Transform(Seconds()-t1,"999.99")+" 秒"


Function getMc()   
   vRet = 0
   If Cj!=nCj
      nMc=nRec
   Endif
   vRet = nMc
   nRec=nRec+1
   nCj=Cj
   nMc=vRet
   Return MAX(vRet-1,00000001)
*****************
func test2

SELECT tt
t1=Seconds()
Index On 200-Cj Tag px
nCj=0
nMc=1
nRec=1
Scan
    If Cj!=nCJ
        nMc=nRec
    EndIF
    Replace Mc With nMc
    nRec=nRec+1
    nCj=Cj
    nMc=Mc
EndScan
? 'scan',Transform(Reccount())+" 條記錄共運行:"+Transform(Seconds()-t1,"999.99")+" 秒"

*use
return

_________________
利用>>搜尋<<的功能會比問的還要快得到答案.
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
syntech



註冊時間: 2003-05-16
文章: 4211
來自: Taipei,Taiwan

第 6 樓

發表發表於: 星期二 十一月 07, 2017 9:30 pm    文章主題: 引言回覆

ckp6250 寫到:
100萬條記錄時,如果資料來源都是實體硬碟的話,結果會略有不同,
比如,Create Table c:\tt (Bh C(10),Cj N(3),Mc N(7))

1樓的程式,需要寫入硬碟100萬次(Replace Mc With nMc ),效能會大為減低,
2樓則只讀不寫,所以,不管資料來源是 cursor 或實體 table , 效能相差不大



不一定.

在FILE SERVER 上,為了安全起見,
通常OS的硬碟讀寫策略會使用較慢的 WRITE THROUGH,
而非較快的WRITE BACK策略,
這時確實一樓應該會感覺到慢一點.
(這裡其實也很難說,因為現代的OS已經比計算機概論中的範本進步很多)

但若是WRITE BACK時,
除非TABLE大到OS的DISK CACHE 裝不進去,
否則一樣的機會較大.
話說回來,就算是CURSOR,
如果資料真的太大的時候,
一樣會被OS移出RAM,擺到實體磁碟中.
也就是根目錄的pagefile.sys

_________________
如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙


syntech 在 星期二 十一月 07, 2017 9:43 pm 作了第 1 次修改
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
ckp6250



註冊時間: 2004-07-30
文章: 1642


第 7 樓

發表發表於: 星期二 十一月 07, 2017 9:41 pm    文章主題: 引言回覆

如果是SSD再加上cache很大的話,可能沒差多少

但,如果是傳統硬碟的話,寫入100萬次,(還有索引檔也要隨之更新),用猜的,也知道會有效能問題,

不過,都不要緊啦,使用者最關心的是東西有沒有跑出來,正不正確。
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
ckp6250



註冊時間: 2004-07-30
文章: 1642


第 8 樓

發表發表於: 星期二 十一月 07, 2017 9:43 pm    文章主題: 引言回覆

garfield 寫到:

scan的要108.56 秒.


您的機器要換了啦,
像我的機器,i7+32G ram + 高速ssd

不管跑一或跑二,都很快, Laughing


ckp6250 在 星期二 十一月 07, 2017 10:11 pm 作了第 2 次修改
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
syntech



註冊時間: 2003-05-16
文章: 4211
來自: Taipei,Taiwan

第 9 樓

發表發表於: 星期二 十一月 07, 2017 9:51 pm    文章主題: 引言回覆

ckp6250 寫到:

但,如果是傳統硬碟的話,寫入100萬次,(還有索引檔也要隨之更新),用猜的,也知道會有效能問題,


現在的傳統硬碟有buffer ram,8/16/32/64/128/256MB,
還有混合SSD的.

有錢就是任性.

_________________
如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
syntech



註冊時間: 2003-05-16
文章: 4211
來自: Taipei,Taiwan

第 10 樓

發表發表於: 星期二 十一月 07, 2017 10:00 pm    文章主題: 引言回覆

ckp6250 寫到:
garfield 寫到:

scan的要108.56 秒.


您的機器要換了啦,
像我的機器,i7+32G rma + 高速ssd

不管跑一或跑二,都很快, Laughing



看起來要拿出鎮店之寶
486DX4-100 + 1M RAM + 540M HDD 來測試了.
win95 應該可以動吧.


Very Happy Very Happy Very Happy Very Happy

_________________
如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
ckp6250



註冊時間: 2004-07-30
文章: 1642


第 11 樓

發表發表於: 星期二 十一月 07, 2017 10:03 pm    文章主題: 引言回覆

syntech 寫到:

現在的傳統硬碟有 buffer ram 256MB


真想買來當 Server HD 使用 !

很久沒有買硬碟了,不知道進步這麼快!
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
ckp6250



註冊時間: 2004-07-30
文章: 1642


第 12 樓

發表發表於: 星期二 十一月 07, 2017 10:09 pm    文章主題: 引言回覆

syntech 寫到:

看起來要拿出鎮店之寶
486DX4-100 + 1M RAM + 540M HDD 來測試了.
win95 應該可以動吧.


garfield已經程式寫好了,煩請用貴【鎮店之寶】測看看,
給大伙長點見識,看看100萬筆跑起來如何?
Laughing Laughing Laughing Laughing Laughing
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
garfield
Site Admin


註冊時間: 2003-01-30
文章: 2157


第 13 樓

發表發表於: 星期三 十一月 08, 2017 10:26 am    文章主題: 引言回覆

ckp6250 寫到:
garfield 寫到:

scan的要108.56 秒.


您的機器要換了啦,
像我的機器,i7+32G ram + 高速ssd

不管跑一或跑二,都很快, Laughing


我都是用客戶不要的電腦湊一湊來用, 太快了我會跟不上, 會以為我老年痴呆.
讓我沈浸在我的動作還很迅速的幻覺中吧. XD

_________________
利用>>搜尋<<的功能會比問的還要快得到答案.
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
syntech



註冊時間: 2003-05-16
文章: 4211
來自: Taipei,Taiwan

第 14 樓

發表發表於: 星期三 十一月 08, 2017 11:55 am    文章主題: 引言回覆

ckp6250 寫到:
syntech 寫到:

看起來要拿出鎮店之寶
486DX4-100 + 1M RAM + 540M HDD 來測試了.
win95 應該可以動吧.


garfield已經程式寫好了,煩請用貴【鎮店之寶】測看看,
給大伙長點見識,看看100萬筆跑起來如何?
Laughing Laughing Laughing Laughing Laughing



這種機器"開一次是一次,開一次少一次".
電源鈕按下去不知道會不會"碰"一聲.

所以我也不敢開.
都是先用 VM跑 WIN95/98 看看.

_________________
如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
lygcw9603



註冊時間: 2011-12-25
文章: 126


第 15 樓

發表發表於: 星期三 十一月 08, 2017 12:21 pm    文章主題: 引言回覆

1KW條記錄SQL命令比VFP命令多跑30秒以上;VFP用時在30-40秒。
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
前往頁面 1, 2, 3  下一頁
1頁(共3頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作