在修整填写类型列表时遇到性能问题。以下是我的简化代码:
public static List<Product> GetProducts()
{
List<Product> products = new List<Product>();
using (DbQuery query = new DbQuery()) //this is database access class
{
query.CommandText = "SELECT ProdID, ProdName,Price FROM SomeTable " ;+
using (IDataReader rdr = query.ExecuteReader())
{
while (rdr.Read())
{
Product prd = new Product();
prd.ProdID = DbQuery.ReadInt ( rdr, "ProdID", -1 );
prd.ProdName = DbQuery.ReadString(rdr, "ProdName", "");
prd.Price = DbQuery.ReadDouble(rdr, "Price", 0);
products.Add(prd);
}
}
}
}
我也有简单的struct product(ProdID,ProdName,Price)。
我的问题是执行GetProducts()需要4秒。查询返回大约600条记录,返回结果需要几毫秒,因此我确信填写产品集合需要花费所有时间。我在这里做的事情效率低吗?请帮忙。 谢谢, 格尔达
答案 0 :(得分:1)
您是否尝试在要过滤的字段上添加索引?这肯定会加快你的查询速度,而不是没有索引。
答案 1 :(得分:1)
列表插入非常快。还有其他一切必须在这里进行。尝试使用和不使用products.Add(prd)
进行计时。我怀疑你会发现它们几乎完全相同。
以下是我如何解决这个问题:一次评论一行,直到你看到性能大幅提升 - 然后你就会发现你的罪魁祸首。
需要注意的另一件事是:数据库性能不是静态的。例如,第一次执行需要4秒的查询可能只需要100毫秒来执行第二次,因为所有数据都缓存到RAM中,因此第二次不需要执行物理I / O.当SQL旋转很多东西时,对数据库的第一个查询将会很慢。我的建议:总是从一个热缓存开始,这意味着运行一次代码然后再次运行它,并且只考虑第二个时序真实。更好的是,运行代码10次,然后将其计时10次,然后抛出前10次并平均秒。
答案 2 :(得分:1)
正如Justin所建议的那样,我个人会开始评论代码段,直到找到导致瓶颈的原因。例如,我可能首先使例程只运行以数据库为中心的代码:
public static List<Product> GetProducts()
{
List<Product> products = new List<Product>();
using (DbQuery query = new DbQuery())
{
query.CommandText = "SELECT ProdID, ProdName,Price FROM SomeTable ";
using (IDataReader rdr = query.ExecuteReader())
{
while (rdr.Read())
{
//Product prd = new Product();
//prd.ProdID = DbQuery.ReadInt(rdr, "ProdID", -1);
//prd.ProdName = DbQuery.ReadString(rdr, "ProdName", "");
//prd.Price = DbQuery.ReadDouble(rdr, "Price", 0);
//products.Add(prd);
}
}
}
return products;
}
通过注释掉创建Product对象的部分并将它们添加到列表中,我可以看到数据库相关代码运行的速度有多快。如果运行速度快4秒,那么我知道这与Product对象的创建和/或对DBQuery的调用有关,这需要很长时间才能完成。
这是试验和错误,但由于这个例程非常简单,所以不需要很长时间来进行这种类型的分析。
答案 3 :(得分:0)
如果您可以预先调整列表大小,通常可以做得更好。如果查询有一个合理的最小大小,或者你有其他方式知道(或合理猜测)一个好的初始大小,你可能会得到一点点提升。
答案 4 :(得分:0)
仅仅从它的声音来看,这必须是数据库性能或延迟问题(如果远程连接。)