列出<t>填充集合性能</t>

时间:2009-10-14 21:55:37

标签: ado.net .net-2.0 c#-2.0

在修整填写类型列表时遇到性能问题。以下是我的简化代码:

         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条记录,返回结果需要几毫秒,因此我确信填写产品集合需要花费所有时间。我在这里做的事情效率低吗?请帮忙。 谢谢, 格尔达

5 个答案:

答案 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)

仅仅从它的声音来看,这必须是数据库性能或延迟问题(如果远程连接。)