1. 程式人生 > >unity程式優化(一)

unity程式優化(一)

一、正確操作字元
字串在我們程式設計過程中使用的最頻繁的一種基礎資料型別,使用不慎就會帶來額外的效能開削。
string str=”string1”+100;
string str1=”string1”+100.ToString();
第一行程式碼會有一次裝箱操作,第二行程式碼ToString()呼叫的是一個非託管的方法。ToString方法如下:
[SecurityCritical]
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern string FormatInt32(int value, string format, NumberFormatInfo info);
在我們頻繁處理字串的時候會生成很多零時字串,這樣就會帶來效能損耗,此時我們應該用StringBuilder來代替string.
在編碼的處理字串的時候,1、避免裝箱操作,2、儘可能的減少零時字串的產生
二、給物件建立比較器


在某些情況下,我們需要用到排序,這時候我們在寫程式碼的時候,可以建立一個比較器來實現排序。比如在ui上要顯示學生的成績排序

    public class Student : IComparable
    {
        public string Name;
        public int Score;
        public int Age;
        public int CompareTo(object obj)
        {
            Student s = obj as Student;
            return Score.CompareTo(s.Score);
        }
    }
     static
void Main(string[] args) { List<Student> list = new List<Student>(); list.Add(new Student() { Name = "小強", Score = 100 ,Age=22}); list.Add(new Student() { Name = "張三", Score = 20, Age = 10 }); list.Add(new Student() { Name = "小麗", Score = 60
, Age = 30 }); list.Add(new Student() { Name = "小虎", Score = 55, Age = 25 }); list.Sort(); foreach(var v in list) { Console.WriteLine(string.Format("{0} socre is :{1}",v.Name,v.Score)); } Console.ReadKey(); } }

結果為

張三 socre is :20
小虎 socre is :55
小麗 socre is :60
小強 socre is :100
現在我改變注意了,我要實現按年齡排序,我們可能回去改CompareTo方法,如果類比較多的時候,你這樣改多費勁呢,這時我們可以自定義一個比較器,繼承於IComparer

 public class AgeComparer : IComparer<Student>
    {

        public int Compare(Student x, Student y)
        {
            return x.Age.CompareTo(y.Age);
        }
    }
    main函式呼叫如下:
       list.Sort(new AgeComparer());

輸出結果如下:
張三 socre is :20 age :10
小強 socre is :100 age :22
小虎 socre is :55 age :25
在這其實我建議使用泛型的比較器,這樣就不用型別轉換了,如果集合比較大,型別轉換就會影響效能,所以用IComparable和IComparer替換IComparable,IComparer是可取的。Student類更改如下:

    public class Student : IComparable<Student>
    {
        public string Name;
        public int Score;
        public int Age;
        public int CompareTo(Student other)
        {
            return Score.CompareTo(other.Score);
        }
    }

三、深拷貝和淺拷貝
淺拷貝:將物件中的所有欄位複製到新的物件(副本)中,值型別欄位的值被複制到副本中後,在副本中修改不會影響到與物件對應的值,而引用型別的欄位被複制到副本中的是引用型別的引用,而不是引用物件本身,在副本中對引用型別的欄位修改會影響到源資料。
深拷貝:同樣是將所用欄位複製到新物件,只不過不論是值型別欄位還是引用型別的欄位,都會重新建立並賦值,對副本的修改不會影響源資料。
實現淺拷貝我們只需要使用MemberwiseClone就可以了
//
// 摘要:
// 建立當前 System.Object 的淺表副本。
//
// 返回結果:
// 當前 System.Object 的淺表副本。
[SecuritySafeCritical]
protected Object MemberwiseClone();

 public class Student :ICloneable
    {
        public string Name;
        public int Score;
        public int Age;

        public object Clone()
        {
            return this.MemberwiseClone();
        }
        //深拷貝
        public Student DeepClone()
        {
            using (Stream st = new MemoryStream())
            {
                IFormatter format = new BinaryFormatter();
                format.Serialize(st, this);
                st.Seek(0, SeekOrigin.Begin);
                return format.Deserialize(st) as Student;
            }
        }
        //淺拷貝
        public Student ShallowClone()
        {
            return Clone() as Student;
        }
    }