Является ли один из этих методов VB.NET более быстрым: SaveSetting () или SetValue ()? - PullRequest
0 голосов
/ 29 июня 2019

Я много обновляю показатели своего приложения в реестре и хочу знать, какой метод записи в системный реестр значительно быстрее.

1 Ответ

0 голосов
/ 29 июня 2019

Если вы используете декомпилятор .NET для просмотра исходного кода класса / модуля Interaction в пространстве имен Microsoft.VisualBasic, вы обнаружите, что метод SaveSetting() на самом деле использует SetValue() под капотом:*

/// <summary>Saves or creates an application entry in the Windows registry. The My feature gives you greater productivity and performance in registry operations than SaveSetting. For more information, see <see cref="P:Microsoft.VisualBasic.Devices.ServerComputer.Registry" />.</summary>
/// <param name="AppName">Required. String expression containing the name of the application or project to which the setting applies.</param>
/// <param name="Section">Required. String expression containing the name of the section in which the key setting is being saved.</param>
/// <param name="Key">Required. String expression containing the name of the key setting being saved.</param>
/// <param name="Setting">Required. Expression containing the value to which <paramref name="Key" /> is being set.</param>
/// <exception cref="T:System.ArgumentException">Key registry could not be created, or user is not logged in.</exception>
/// <filterpriority>1</filterpriority>
/// <PermissionSet>
///   <IPermission class="System.Security.Permissions.RegistryPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" />
/// </PermissionSet>
public static void SaveSetting(string AppName, string Section, string Key, string Setting)
{
    Interaction.CheckPathComponent(AppName);
    Interaction.CheckPathComponent(Section);
    Interaction.CheckPathComponent(Key);
    string text = Interaction.FormRegKey(AppName, Section);
    RegistryKey registryKey = Registry.CurrentUser.CreateSubKey(text);
    if (registryKey == null)
    {
        throw new ArgumentException(Utils.GetResourceString("Interaction_ResKeyNotCreated1", new string[]
        {
            text
        }));
    }
    try
    {
        registryKey.SetValue(Key, Setting);
    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally
    {
        registryKey.Close();
    }
}

Или в VB, если вы предпочитаете:

''' <summary>Saves or creates an application entry in the Windows registry. The My feature gives you greater productivity and performance in registry operations than SaveSetting. For more information, see <see cref="P:Microsoft.VisualBasic.Devices.ServerComputer.Registry" />.</summary>
''' <param name="AppName">Required. String expression containing the name of the application or project to which the setting applies.</param>
''' <param name="Section">Required. String expression containing the name of the section in which the key setting is being saved.</param>
''' <param name="Key">Required. String expression containing the name of the key setting being saved.</param>
''' <param name="Setting">Required. Expression containing the value to which <paramref name="Key" /> is being set.</param>
''' <exception cref="T:System.ArgumentException">Key registry could not be created, or user is not logged in.</exception>
''' <filterpriority>1</filterpriority>
''' <PermissionSet>
'''   <IPermission class="System.Security.Permissions.RegistryPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" />
''' </PermissionSet>
Public Sub SaveSetting(AppName As String, Section As String, Key As String, Setting As String)
    Interaction.CheckPathComponent(AppName)
    Interaction.CheckPathComponent(Section)
    Interaction.CheckPathComponent(Key)
    Dim text As String = Interaction.FormRegKey(AppName, Section)
    Dim registryKey As RegistryKey = Registry.CurrentUser.CreateSubKey(text)
    If registryKey Is Nothing Then
        Throw New ArgumentException(Utils.GetResourceString("Interaction_ResKeyNotCreated1", New String() { text }))
    End If
    Try
        registryKey.SetValue(Key, Setting)
    Catch ex As Exception
        Throw ex
    Finally
        registryKey.Close()
    End Try
End Sub

Следовательно, я ожидаю, что они будут иметь одинаковую производительность в данном конкретном случае (при условиивы будете в основном копировать то же поведение).Однако класс Microsoft.Win32.Registry (или свойство My.Computer.Registry, , являющееся просто оболочкой для указанного класса ), будет более гибким ипредоставляет больше опций, как отмечено в документации (спасибо, Джими!) и в комментариях XML, показанных выше.

Что касается производительности, чтобы быть на 100% определенным (при условии, что вам действительно нужно), то вы всегда должны измерять.


* Этот код был извлечен с использованием ILSpy .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...