Buat variabel atau panggil metode beberapa kali - Mana yang lebih baik?

Saya bertanya-tanya tentang membuat variabel baru atau metode pemanggilan beberapa kali. Apa yang lebih baik untuk kinerja keseluruhan dan pembersihan GC? Lihatlah:

public static string GetValue(RegistryKey key, string value)
{
    if (key.GetValue(value) == null)
        return null;
    string newValue = key.GetValue(value).ToString();
    if (String.IsNullOrWhiteSpace(newValue))
        return null;
    return newValue.ToLower();
}

Bagaimana saya bisa memperjelas kode ini?


person xNombre    schedule 24.04.2015    source sumber
comment
Kemungkinan besar juga tidak. Anda tidak pernah tahu apa yang akan dilakukan kompiler untuk mengoptimalkan kode Anda.   -  person Erik Philips    schedule 24.04.2015
comment
StackOverflow adalah tentang masalah pemrograman tertentu. Jika Anda ingin berbicara tentang kualitas kode, kunjungi Tinjauan Kode. Silakan periksa halaman Cara Bertanya sebelum memposting di sana (seperti yang seharusnya Anda lakukan di sini).   -  person Pierre-Luc Pineault    schedule 24.04.2015
comment
Saya kira, ini adalah optimasi prematur yang tidak perlu. Dalam kebanyakan kasus, Anda harus menggunakan profiler untuk menemukan hambatan dan mengoptimalkannya.   -  person Pavel Oganesyan    schedule 24.04.2015
comment
Ini bukan kasus optimasi prematur. Jika metode RegistryKey.GetValue tidak menyimpan hasilnya dalam cache, panggilan ini akan memerlukan akses registri, yang beberapa kali lipat lebih lambat dibandingkan mengakses variabel lokal.   -  person Douglas    schedule 24.04.2015


Jawaban (3)


Secara umum, ketika Anda perlu menggunakan hasil pemanggilan metode beberapa kali, Anda harus menetapkannya ke variabel lokal terlebih dahulu. Variabel lokal hanya memerlukan bingkai tumpukan metode Anda beberapa byte lebih besar (8 byte untuk variabel objek pada 64-bit), dan akan dihapus secara otomatis saat metode kembali – ini tidak berpengaruh pada GC.

Di sisi lain, pemanggilan metode yang berulang akan mengharuskan semua logikanya dieksekusi lagi, sehingga menimbulkan alokasi frame tumpukan yang diperlukan dan kemungkinan pembuatan instance objek. Dalam kasus Anda, RegistryKey.GetValue membuat situasi menjadi lebih buruk, karena ia perlu mengakses Registri Windows, menjadikannya beberapa kali lipat lebih lambat daripada akses variabel lokal. Selain itu, Anda mungkin menghadapi kondisi balapan di mana kedua panggilan menghasilkan nilai yang berbeda.

public static string GetValue(RegistryKey key, string name)
{
    object value = key.GetValue(name);
    if (value == null)
        return null;
    string valueStr = value.ToString()
    if (String.IsNullOrWhiteSpace(valueStr))
        return null;
    return valueStr.ToLower();
}

Perhatikan bahwa masalah ini sebagian besar akan diperbaiki di C# 6, di mana Anda dapat menggunakan operator bersyarat nol:

public static string GetValue(RegistryKey key, string name)
{
    string value = key.GetValue(name)?.ToString();
    if (String.IsNullOrWhiteSpace(value))
        return null;
    return value.ToLower();
}
person Douglas    schedule 24.04.2015
comment
Wow, dengan C# 6 itu akan menjadi sangat mudah! Seperti yang saya mengerti '?' akan mengembalikan nilai string nol jika diperlukan? - person xNombre; 24.04.2015
comment
a?.Foo() akan langsung bernilai null jika a adalah null. Ini akan memanggil (dan mengembalikan hasil) a.Foo() jika a bukan null. - person Douglas; 24.04.2015

Buat variabel lokal dan panggil metode tersebut satu kali. Ada overhead (yang memang kecil) untuk pemanggilan metode lokal. Jika Anda menggunakan panggilan metode jarak jauh, perbedaannya akan jauh lebih terasa.

person Kevin    schedule 24.04.2015

menggunakan ? operator membuatnya lebih mudah dibaca dan kinerjanya lebih baik seperti yang Anda lihat

public static string GetValue(RegistryKey key, string value)
{
    string valueStr=(string)key.GetValue(value);
    return string.IsNullOrWhiteSpace(valueStr)?null:valueStr.ToLower();
}
person M.kazem Akhgary    schedule 24.04.2015
comment
Mengapa menurut Anda operator ternary memiliki kinerja yang lebih baik? - person Yuval Itzchakov; 26.04.2015
comment
TIDAK. maksud saya kinerja yang lebih baik untuk transmisi langsung ke string...lebih sedikit if else dibandingkan dengan kode OP. saya tidak berpikir menggunakan if else atau ? sangat mempengaruhi kinerja.@YuvalItzchakov - person M.kazem Akhgary; 26.04.2015