如何优化代码以使其运行更快

时间:2019-07-25 09:08:25

标签: c# sql

我正在编写一个可以通过API提取某些数据的代码,但是它需要一个名为Item id的参数,该参数存储在我的数据库中。代码工作正常,我得到了想要的输出类型,但是问题是,这需要花费更多时间(不是很快)。

有两个功能

  1. 功能Item_id从SQL服务器中已经存在的数据库中获取Item_Id。

  2. 主函数,该函数调用Item_id函数以从数据库中获取Item_id。这些Item ID在API查询中用作参数,以获取该特定Item_id的序列号的序列号。


using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Data;
using System.Data.SqlClient;
using System.Net;
using Newtonsoft.Json;


namespace ConsoleApp2
{
    class serial_connected_to_Database
    {
    /**************************************************
     * Properties to convert Json output to C# objects
     * ***********************************************/
       #region Properties
       public class SerialNumber
       {
           public string serialnumber_id { get; set; }
           public string serialnumber { get; set; }
           public string status { get; set; }
       }

       public class PageContext
       {
            public int page { get; set; }
            public int per_page { get; set; }
            public bool has_more_page { get; set; }
            public string sort_column { get; set; }
            public string sort_order { get; set; }
       }

       public class RootObject
       {
            public int code { get; set; }
            public string message { get; set; }
            public List<SerialNumber> serial_numbers { get; set; }
            public PageContext page_context { get; set; }
       }
       #endregion

    /***********************************************************
     * Main program to fecth serial Numbers based on the Item_id
     * specified in the API
     ***********************************************************/
       public static void Main()
       {
            string strResponse = string.Empty;  //to collect json Data
            DataTable dataTable = Item_Id();    //fetching item id from function Item_id
            foreach (DataRow dr in dataTable.Rows) 
            {
                Console.WriteLine(dr["col_item_id"]+"Serial numbers for particular Item id are given below");
                int k = 1; //variable to navigate to different pages
                while (1 > 0)
                {
                /****************************************************************
                 * Requesting API with item id as parameter
                 * *************************************************************/
                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(@"https://books.zoho.com/api/v3/items/serialnumbers?per_page=200&item_id=" + dr["col_item_id"] + "&organization_id=***********&page=" + k);
                    request.Method = "GET";
                    request.Headers.Add("Authorization", "*************************");

                    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                    {
                        if (response.StatusCode != HttpStatusCode.OK)
                        {
                            throw new ApplicationException("Error code in response recieved: " + response.StatusCode.ToString());
                        }

                        using (Stream resStream = response.GetResponseStream())
                        {
                            if (resStream != null)
                            {
                                using (StreamReader streamReader = new StreamReader(resStream))
                                {
                                    strResponse = streamReader.ReadToEnd();
                                }
                            }
                       }
                   }
                   string Jsoncontent = strResponse;

                /***************************************************************
                 * Deserializing Json Data into C# objects
                 * ************************************************************/
                    RootObject root = JsonConvert.DeserializeObject<RootObject>(Jsoncontent);
                    if (root.serial_numbers.Count != 0)
                    {
                        for(int i = 0; i < root.serial_numbers.Count; i++)
                        {                           
Console.WriteLine(root.serial_numbers[i].serialnumber);
                        }
                    }
                    else
                    {
                        break;
                    }
                    k = k + 1;
                    Console.WriteLine("Page= " + k);
                }
            }
        }

    /******************************************************************************
     * Function to return Item id which is stored in Database 
     * ***************************************************************************/
        public static DataTable Item_Id()
        {
            SqlConnection cnn = new SqlConnection(@"Data Source=************;Initial Catalog=*************;User ID=*******************;Password=*************");
            cnn.Open();
            DataTable dataTable = new DataTable();

            string Query = "select col_item_id from tbl_Zoho_Items_data";

            SqlDataAdapter DA = new SqlDataAdapter(Query, cnn);
            DA.Fill(dataTable);
            return dataTable;
        }
    }
}

执行过程需要花费很多时间,请帮助我以一些最佳方式使用书写或任何最佳做法。

3 个答案:

答案 0 :(得分:1)

许多工作由外部服务完成-HTTP请求和数据库查询。 在不了解花费时间之前,您无法有意义地优化代码-可能是因为瓶颈不在您的应用程序之内,所以无法进行改进,但是您无法知道,除非您对应用程序进行概要分析,和/或模拟外部服务。试用一下Profiler,了解您的应用程序的实际功能-通过这种方式您将学到更多。

答案 1 :(得分:0)

我认为最好使用DataReader或tan的DataTable并使用Async方法进行连接和发布,或者可以获取项目列表,然后使用parallel.for异步方法中的方法,我认为这样做会更快< / p>

我认为这样会更好,更快,请对其进行测试并告诉我

<mat-select-trigger>
      {{filter.currentValue ? filter.currentValue[0] : ''}}
      <span *ngIf="filter.currentValue?.length > 1">
        (+{{filter.currentValue.length - 1}} {{filter.currentValue?.length === 2 ? 'other' : 'others'}})
      </span>
    </mat-select-trigger>

答案 2 :(得分:0)

您可以尝试在Web api代码中应用缓存技术。意思是,仅当缓存不可用时,才必须调用db。您到处都会得到样品。