網站首頁 編程語言 正文
對大型網站,技術涉及面非常廣,對硬件,軟件,編程語言,Web Service,防火墻等等有很高要求。
面對大量用戶,高并發請求,可以使用高性能服務器,高性能編程語言,高性能數據庫,加大帶寬等,這意味著巨大的投入。
如果你沒有這樣的打算,而又想獲得更好的系統性能,則需要我們精打細算,從"軟"的方面著手。
如果你有過以下的一些用法,或者有不同見解,請賜教。
(1)Foreach比for有更好的執行效率。
Foreach所花的時間大約只有for的30%,通過測試結果,在兩者都可以使用的情況下,我們推薦效率更高的Foreach。另外用for寫入數據的時間大約是讀取數據時間的10倍。
(2)避免使用ArrayList
因為任何對象存放到里面,都要轉化為System.Object類型,從ArrayList中取出數據要拆箱回原來的類型。建議使用.NET2.0的泛型,這是一個強類型,可以避免裝箱拆箱的性能消耗。
(3)不要使用UpperCase,LowerCase轉換字符串,再進行比較。用String.Compare代替,他可以忽略大小寫進行比較。
(4)用StringBuilder代替字符串連接符"+"
原因,見我的另一篇文章String 和BulidString性能比較和內在機制
(5)避免在循環內聲明變量,應該在循環外聲明變量,在循環里初始化
//避免
for(int i=0;i<10;i++)
{
AnyClass cl=new AnyClass();
//……
}
//推薦
for(int i=0;i<10;i++)
{
cl=new AnyClass();
//……
(6)捕獲異常,不用使用System.Exception
//避免
try
{
//TODO
}
catch (Exception ex)
{
//TODO(雖然簡單,但性能較差)
}
//推薦
try
{
//TODO
}
catch (System.NullReferenceException ex)
{
//對空對象異常處理
}
catch (System.ArgumentOutOfRangeException ex)
{
//超出范圍異常處理
}
catch (System.InvalidCastException ex)
{
//對異常轉化的處理
}
(7)不要使用異常控制程序流程。
異常捕獲對性能的消耗很大,眾所周知的,能避免使用最好不用
//避免
try
{
result=200/num;
}
catch (Exception ex)
{
result=0
}
//推薦
try
{
result=num!=0?200/num:0;
}
catch (Exception ex)
{
result=0
}
(8)在遇到調用實現IDisposable對象的時候,用Using和try/finally來釋放資源
//避免
public void ExceuteCommand()
{
SqlConnection sql=new SqlConnection(strCon);
SqlCommand cmd=new SqlCommand(sql);
sql.Dispose();//上面出錯,此處有可能永遠都調用不到
cmd.Dispose();
}
//建議
//Using內并不是可以放任何對象,只有實現了IDisposable接口的對象才能被使用。
//編譯器成IL時候,Using會自動把內容放在try/finally里面。
try
{
using(SqlConnection sql=new SqlConnection(strCon))
{
using(SqlCommand cmd=new SqlCommand(sql))
{
//TODO
}
}
}
catch (Exception ex)
{
//
}
finally{
//或者
//sql.Dispose();
//cmd.Dispose();
}
//推薦
因為如果遇到多個實現IDisposable接口的對象需要釋放,try/finally更好些
//推薦
SqlConnection sql=null;
SqlCommand cmd=null;
try
{
sql=new SqlConnection(strCon);
cmd=new SqlCommand(sql);
sql.Open();
cmd.ExecuteNonQuery();
}
finally{
if(sql!=null)
sql.Dispose();
if(cmd!=null)
cmd.Dispose();
}
(9)避免使用反射,反射是比較浪費性能的操作
通過反射來調用類型或方法,字段或屬性是CLR要做更多的工作,如校驗參數,檢查權限,所以速度是非常慢的。對于打算寫一個動態構造類型(晚綁定)的應用程序,可以通過繼承,接口,委托來實現。
(10)值類型組合成字符串,請使用.ToStrng()方法,避免裝箱操作。
//避免
var str="hello"+1+2;
//推薦
var str="hello"+1.ToString()+2.ToString();
(11)StopWatch類測試運行時間
public delegate void AddHandler();
class Program
{
static void Main(string[] args)
{
Utility.ProcessTimeSpan(Program.Add);
Console.Read();
}
public static void Add()
{
var a = 0;
for (int i = 0; i < 100000000; i++)
{
a++;
}
}
}
public static class Utility
{
public static void ProcessTimeSpan(AddHandler addDelegate)
{
//推薦
DateTime start = DateTime.Now;
var timer = Stopwatch.StartNew();
addDelegate();
timer.Stop();
Console.WriteLine("Method took {0} ms", timer.ElapsedMilliseconds);
//傳統
DateTime start = DateTime.Now;
SomeCodeToTime();
DateTime end = DateTime.Now;
Console.WriteLine("Method took {0} ms", (end - start).TotalMilliseconds);
}
}
原文鏈接:https://www.cnblogs.com/jackyfei/archive/2011/03/13/optimize.html
相關推薦
- 2023-02-14 教你使用SQL語句進行數據庫復雜查詢_MsSql
- 2022-04-19 c#中task與thread區別及其使用的方法示例_C#教程
- 2022-04-11 一文帶你了解什么是瀏覽器緩存,DNS,CDN及域名解析類型_網站運營
- 2024-04-07 springboot整合redis配置
- 2023-06-04 React中的合成事件是什么原理_React
- 2022-04-12 C++中菱形繼承的解釋與處理詳解_C 語言
- 2022-06-29 Python解決非線性規劃中經濟調度問題_python
- 2023-02-15 go性能分析工具pprof的用途及使用詳解_Golang
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支