[英]How can I optimize my code so as to run faster
我正在編寫一個可以通過API提取某些數據的代碼,但是它需要一個名為Item id的參數,該參數存儲在我的數據庫中。 代碼工作正常,我得到了想要的輸出類型,但是問題是,這花費了更多的時間(不是很快)。
有兩個功能
函數Item_id從SQL服務器中已經存在的數據庫中獲取Item_Id。
調用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.