2010-01-28 66 views
1

我正在使用JQuery插件(http://docs.jquery.com/Plugins/Autocomplete)向“城市”文本字段添加自动完成功能。该组件调用一个简单地加载所有可能城市值(> 8000)的数组的ASP.NET页面,然后迭代该数组返回那些以用户迄今输入的文本开头的数组。将数据返回到客户端自动完成查询

事情是,它在实际使用中很慢。它滞后于用户输入的内容,大部分时间用户可能不会注意到它在那里。

所以,我的问题是,我该如何加快速度?

我曾经想过,将数据放入数据库并且必须多次击中数组才是更好的选择。其他人是否同意这种信息是硬编码的,因为它并不是一成不变的,需要全部关注回报速度?

如果是这样,你会看什么来提高性能的速度?我应该在应用程序启动时缓存数据并从内存中访问它吗?我会更好,而不是使用多个数组,每个数组都包含以特定字母开头的值,所以我可以直接转到相关的数组,从而迭代一个更小的数组?或者我错过了一个更明显的方法来解决这个问题?

在此先感谢。

+0

数据来自哪里?某种SQL服务器,另一个来源? – 2010-01-28 15:16:30

+0

你可以发布你的代码吗?过滤8,000个字符串应该会立即回来,特别是如果它们位于内存列表或数组中。 – 2010-01-28 16:55:01

回答

1

您发布的代码看起来很正常,应该会很快返回。我的猜测是,你正在使用default "delay" value作为400毫秒的插件。尝试将其更改为像100ms(甚至更低)之类的东西,看看它是否更好:

$('#textbox').autocomplete('your_url_here', { 
    delay: 100 
}); 
+0

这很可能是它。我没有意识到这个参数。在本地测试它当然很好,并且很快。我还没有能够进行现场测试(稍后会做),并且不会将其标记为正确,直到我可以确认它为止。我最初注意到活动服务器和我的开发服务器之间的速度差异,这导致我相信这可能是一个代码问题。稍后再测试并确认它是否修复它。再次感谢。 – BinarySolo 2010-01-29 09:47:00

+0

就是这样。现在正在飞行。谢谢! – BinarySolo 2010-01-31 11:09:17

1

那么你可能不想硬编码任何数据,如果你可以避免它。将它放在数据库中将使管理更改变得更容易。而且没有理由每次都必须查询数据库。您可以将自己在内存中的sql数据缓存到多个列表中。这应该是相当迅速的,除非有某种额外的网络延迟问题。您可能想要发布一些代码,以便人们可以提供更具体的指导。

0

感谢您的回复。 (非常基本)代码如下:

Dim q As String = LCase(Server.UrlDecode(Request.QueryString("q"))) 
Dim arrCities() As String = {"Abano Terme", "Abbadia Cerreto", ... "Zungri"} 
For Each s As String In arrCities 
    If s.ToLower.StartsWith(q) Then 
     Response.Write(s & vbCrLf) 
    End If 
Next 

第2行基本上是一个巨大的数组,声明在代码中是正确的。这并不漂亮,但数据是非易失性的,所以我认为我可以避开它,并且我认为它比从数据库直接提取更快。但是,如果你可以提供一些具体的建议,也许有一些缓存的SQL?

+0

您应该编辑您的问题并在其中添加附加信息,而不是发布新答案。 – 2010-01-28 21:37:21

+0

对不起,新手错误。完全没有发现我的问题上的编辑链接。 – BinarySolo 2010-01-29 09:47:27