簡體   English   中英

如何優化我的代碼以便更快地運行

[英]How can I optimize my code so as to run faster

我正在編寫一個可以通過API提取某些數據的代碼,但是它需要一個名為Item id的參數,該參數存儲在我的數據庫中。 代碼工作正常,我得到了想要的輸出類型,但是問題是,這花費了更多的時間(不是很快)。

有兩個功能

  1. 函數Item_id從SQL服務器中已經存在的數據庫中獲取Item_Id。

  2. 調用Item_id函數以從數據庫中獲取Item_id的主函數。 這些項目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;
        }
    }
}

執行過程需要花費很多時間,請幫助我以最佳方式使用書寫或任何最佳做法。

外部服務正在完成許多工作-HTTP請求和數據庫查詢。 在您了解花費的時間之前,您無法有意義地優化代碼 -可能是因為瓶頸不在您的應用程序之內,所以無法進行改進,但是除非您對應用程序進行概要分析和/或模擬外部程序,否則您無法知道服務。 試用一下Profiler,了解您的應用程序的實際功能-通過這種方式您將學到更多。

我認為最好使用DataReader其他tan DataTable並使用Async方法進行連接和發布,或者可以獲取項目列表,然后在async方法中使用parallel.for方法,我認為這樣會更快

我認為這樣會更好,更快,請對其進行測試並告訴我

        /******************************************************************************
 * Function to return Item id which is stored in Database 
 * ***************************************************************************/
    public static async Task<IEnumerable<string>> Item_Id()
    {
        var items = new List<string>();

        using (var cnn = new SqlConnection(@"Data Source=************;Initial Catalog=*************;User ID=*******************;Password=*************"))
        {
            await cnn.OpenAsync().ConfigureAwait(false);
            var Query = "select col_item_id from tbl_Zoho_Items_data";

            using (var command = new SqlCommand(Query, cnn))
            {
                using (SqlDataReader reader = await command.ExecuteReaderAsync().ConfigureAwait(false))
                {
                    while (await reader.ReadAsync().ConfigureAwait(false)) items.Add(reader["col_item_id"].ToString());
                }
            }

            return items;
        }
    }

    /***********************************************************
 * Main program to fecth serial Numbers based on the Item_id
 * specified in the API
 ***********************************************************/
    public static async Task Main()
    {
        string strResponse = string.Empty; //to collect json Data
        IEnumerable<string> items = await Item_Id().ConfigureAwait(false); //fetching item id from function Item_id

        Parallel.ForEach(items, async item =>
        {
            Console.WriteLine(item + "Serial numbers for particular Item id are given below");

            var k = 1; //variable to navigate to different pages
            while (1 > 0)
            {
                /****************************************************************
                 * Requesting API with item id as parameter
                 * *************************************************************/
                var request = (HttpWebRequest) WebRequest.Create(@"https://books.zoho.com/api/v3/items/serialnumbers?per_page=200&item_id=" + item + "&organization_id=***********&page=" + k);
                request.Method = "GET";
                request.Headers.Add("Authorization", "*************************");

                using (var response = (HttpWebResponse) await request.GetResponseAsync().ConfigureAwait(false))
                {
                    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 (var streamReader = new StreamReader(resStream))
                            {
                                strResponse = await streamReader.ReadToEndAsync().ConfigureAwait(false);
                            }
                    }
                }

                string Jsoncontent = strResponse;

                /***************************************************************
                 * Deserializing Json Data into C# objects
                 * ************************************************************/
                var root = JsonConvert.DeserializeObject<RootObject>(Jsoncontent);
                if (root.serial_numbers.Count != 0)
                    foreach (SerialNumber serial in root.serial_numbers)
                        Console.WriteLine(serial.serialnumber);
                else
                    break;

                k++;
                Console.WriteLine("Page= " + k);
            }
        });
    }

您可以嘗試在Web api代碼中應用緩存技術。 意思是,僅當緩存不可用時,才必須調用db。 您到處都會得到樣品。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM