现在有4万条左右的记录Tab1,strVal01字段中大概有1万个[]括起来的字符串,用Tab2中strVal02和Tab1中strVal01一一比较。目前的问题是速度问题。(大家给个算法就行,如果被采纳,单独再给100)
Tab1具体如下:
ID strVal01
1 [1,2][1,3][x,y]...[10000,10000]
2 [1,2][1,3][x,y]...[10000,10000]
3 [1,2][1,3][x,y]...[10000,10000]
... ....
399999 ...
400000 ....Tab2:
strVal02
strTemp01
strTemp02
strTemp03
...
strTemp10000
Tab1具体如下:
ID strVal01
1 [1,2][1,3][x,y]...[10000,10000]
2 [1,2][1,3][x,y]...[10000,10000]
3 [1,2][1,3][x,y]...[10000,10000]
... ....
399999 ...
400000 ....Tab2:
strVal02
strTemp01
strTemp02
strTemp03
...
strTemp10000
strval01的格式是一个坐标对应一个值,如:[1,2][3][2,3][0][3,4][4]
比如:strTemp01=[1,2]>2 and ([2,3]=0 or [3,5]>2)比较的过程:
我会把strTemp01中的坐标转换成strVal01中的对应的值,然后再用ScriptControl运行得到一个Ture或False
把两个表的内容先读取到内存中,可能会快一些,但都没有太大的效果。
www.vicmiao.com
努力就有美好时光!
2: 循环ds2 数据,循环中用ds1.select(“exc”) 形成 DataRow[] 很多满足条件的行, 因为它不操作数据库,直接从内存中找的
3:exc表达式需要优化:一定要写成:把=比较的写在最前面,比数字的写在其次前面 or 最费时间
毕竟性能要比sql好上很多
1 你的记录以什么方式保存的?是数据库?还是文本文件?
2 Tab2 中用于比较的只有一条记录吗?如果是数据库,从现在表述的情况理解,似乎可以:
"Select * From Tab1 Where strVal01 = '" & strVal02 & "'"
你的是用js Enginee做的
必须要先连接成字符串
然后run 才能返回true false
所有的记录的strval01拆分出来的坐标不重复。
整个运行下来至少进行40000* 10000
如果在tab1里面先排序的话,这个排序也是需要时间,同样消耗时间
Dim s As String
Dim s1 As String
Dim i As LongDim dblStart As Double
Dim dblEnd As DoublePrivate Sub Form_Load()
'生成测试字符串
dblStart = Timer
For i = 1 To 100000
DoEvents
s = s + "[" & i & "]"
Next i
dblEnd = TimerDebug.Print dblEnd - dblStartdblStart = Timer
For i = 1 To 100000
DoEvents
'这里很费时
s1 = Replace(s, "][", "|")
Next i
dblEnd = TimerDebug.Print dblEnd - dblStart
End Sub
DoEvents
s = s + "[" & i & "]"
Next i============== 这当然慢, 因为内存的太频繁分配如果预先知道字符数量, 或者能大约推算出字符数量, 可先分配内存, 然后用mid函数
能极快的提高速度
同时, replace是vb中效率最高的函数之一, replace不需要执行多次。 一次就能全部替换
下列2个timer的差加起来大概0.5秒左右.
Private Sub Form_Load()
'生成测试字符串
Dim dblStart As Double
Dim dblEnd As Double
Dim s As String, s1 As String, pos As Long
Dim i As Long
dblStart = Timer
s = Space(1000000)
pos = 1
For i = 1 To 100000
DoEvents
Mid(s, pos) = "[" & i & "]"
pos = pos + Len("[" & i & "]")
Next i
s = Left(s, pos - 1)
dblEnd = Timer
Debug.Print dblEnd - dblStart
dblStart = Timer
For i = 1 To 1 'repleace只要操作一次
DoEvents
'这里很费时
s1 = Replace(s, "][", "|")
Next i
s1 = Mid(s1, 2, Len(s1) - 2)dblEnd = Timer
Debug.Print dblEnd - dblStartEnd Sub
2.如果你所用的字符有一定的格式,可以使用Split方法轉換成數組處理
3.在同一個運算式時,晝量減少多個邏輯運算放在一起判斷,請改用單個單個單個階層判斷
OAOFFICE 文档控件,能够在浏览器窗口中直接编辑Word、Excel、Powerpoint、Viso、WPS等办公文档并保存到Web服务器上,实现了本地办公与网络办公的无缝整合,彻底解决了B/S模式下的电子政务/办公自动化等系统对常用Word、Excel等文档无法在线编辑的难题。除了在线编辑保存的基本功能外,SOAOffice 文档控件同时支持痕迹保留,手写签名,电子印章、数字签名、全文手写批注等高端电子政务、电子商务、办公自动化系统所必备的功能,是E-Government、E-Business和OA系统开发的最佳选择组件!
有需要的朋友可加入MSN:[email protected] WWW.KENHANSOFT.COM
联系方式:010-58696133/85349084 田小姐
OAOFFICE 文档控件,能够在浏览器窗口中直接编辑Word、Excel、Powerpoint、Viso、WPS等办公文档并保存到Web服务器上,实现了本地办公与网络办公的无缝整合,彻底解决了B/S模式下的电子政务/办公自动化等系统对常用Word、Excel等文档无法在线编辑的难题。除了在线编辑保存的基本功能外,SOAOffice 文档控件同时支持痕迹保留,手写签名,电子印章、数字签名、全文手写批注等高端电子政务、电子商务、办公自动化系统所必备的功能,是E-Government、E-Business和OA系统开发的最佳选择组件!
有需要的朋友可加入MSN:[email protected] WWW.KENHANSOFT.COM
联系方式:010-58696133/85349084 田小姐
第一、字符串分析函数的效率。
第二、通过下标定位值。其中问题2你需要一个二维矩阵,没有必要用数据库。至少表1没有必要。
二维矩阵同样可以增,删,改,查,存,载。有关这部分就不在赘述。问题1.
extern int g_value_matrix[MAX][MAX];void trans_raw_string(char* inbuf, char* outbuf)
{
char* begin = inbuf;
char tmp[256];
char* row_str = NULL;
char* col_str = NULL;
int row_val = 0;
int col_val = 0; p = strchr(begin, "[");
while(*p){
len = p - begin;
memcpy(outbuf+dcnt, begin, len);
dcnt += len; // get row value
row_str = ++p;
p = strchr(p, ',');
*p = 0;
row_val = atoi(first_str); // get col value
col_str = ++p;
p = strchr(p, ']');
*p = 0;
col_val = atoi(second_str); // get value
value = g_value_matrix[row_val][col_val]; sprintf(tmp, "%d", value);
len = strlen(tmp);
memcpy(outbuf+dcnt, tmp, len);
dcnt += len; begin = ++p;
p = strchr(begin, '[');
} strcpy(outbuf+dcnt, begin);
outbuf[dcnt] = 0; return dcnt;
}
===========================
请教 a||b||c a&&b&&c 这样为什么不好
For i = 1 To 100000 'repleace只要操作一次
DoEvents
'这里很费时
s1 = Replace(s, "][", "|")' 其实这里的s是100000个不同的字符串,这里为了测试用了一个
Next i------
这当然慢, 因为内存的太频繁分配如果预先知道字符数量, 或者能大约推算出字符数量, 可先分配内存----
这个我试试,我觉得有道理。----
谢谢大家。