Dica Rápida: Ganhando desempenho com o modificador Sealed

Olá! Esta é mais uma Dica Rápida e aqui vou demonstrar como uma simples palavra-chave da linguagem pode fazer o desempenho de sua aplicação aumentar. Parece inacreditável? Pois acredite, não é! Conhecendo a palavra-chave sealed sealed é uma palavra-chave que indica que uma dada classe não pode ser herdada, ou seja, que ela está fechada para extensão. O que essa palavra-chave esconde é uma informação muito útil ao compilador que, grosso modo é, ao visitar um método de uma classe sealed é líquido e certo que seu tipo não conterá qualquer derivação e, por isso, o compilador just in time (JIT) sabe que não precisa identificar se o tipo é herdado ou não. Um outro ponto é que, por conta desta identificação inequívoca, um método/membro invocado de uma classe sealed pode ser colocado em linha com o invocador, deixando a chamada mais rápida -- como quando se usa o atributo [MethodImpl(MethodImplOptions.AggressiveInlining)]. Veja só um exemplo de benchmarking bastante simples, baseado no código abaixo: public class Sealed { public class BaseType { public virtual int GetInt() => 1; } public class NonSealedType : BaseType { public override int GetInt() => 10; } public sealed class SealedType : BaseType { public override int GetInt() => 10; } private readonly NonSealedType nonSealed = new(); private readonly SealedType @sealed = new(); [Benchmark(Baseline = true)] public int GetIntNonSealed() => nonSealed.GetInt() + 42; [Benchmark] public int GetIntSealed() => @sealed.GetInt() + 42; } E o resultado foi o seguinte: Repare na diferença: quase 15x a favor da classe sealed! Por conta desta vantagem o time do .NET vem modificando e criando classes internas e privadas do runtime do .NET para sealed, de modo a melhorar seu desempenho -- aqui um post a respeito do assunto (em inglês). Como regra do polegar, recomendaria o seguinte: Se a classe é privada/interna e não é herdada, então sealed. Se a classe é pública e não é desejável que ela seja herdada, então sealed. De outro modo não faz sentido aplicar a palavra-chave. Gostou? Me deixe saber pelos indicadores. Caso deseje, deixe um comentário ou me procure nas redes sociais. Até a próxima!

Apr 14, 2025 - 13:15
 0
Dica Rápida: Ganhando desempenho com o modificador Sealed

Olá!

Esta é mais uma Dica Rápida e aqui vou demonstrar como uma simples palavra-chave da linguagem pode fazer o desempenho de sua aplicação aumentar.

Parece inacreditável? Pois acredite, não é!

Conhecendo a palavra-chave sealed

sealed é uma palavra-chave que indica que uma dada classe não pode ser herdada, ou seja, que ela está fechada para extensão.

O que essa palavra-chave esconde é uma informação muito útil ao compilador que, grosso modo é, ao visitar um método de uma classe sealed é líquido e certo que seu tipo não conterá qualquer derivação e, por isso, o compilador just in time (JIT) sabe que não precisa identificar se o tipo é herdado ou não. Um outro ponto é que, por conta desta identificação inequívoca, um método/membro invocado de uma classe sealed pode ser colocado em linha com o invocador, deixando a chamada mais rápida -- como quando se usa o atributo [MethodImpl(MethodImplOptions.AggressiveInlining)].

Veja só um exemplo de benchmarking bastante simples, baseado no código abaixo:

public class Sealed
{
    public class BaseType { public virtual int GetInt() => 1; }
    public class NonSealedType : BaseType { public override int GetInt() => 10; }
    public sealed class SealedType : BaseType { public override int GetInt() => 10; }

    private readonly NonSealedType nonSealed = new();
    private readonly SealedType @sealed = new();

    [Benchmark(Baseline = true)]
    public int GetIntNonSealed() =>
        nonSealed.GetInt() + 42;

    [Benchmark]
    public int GetIntSealed() =>
        @sealed.GetInt() + 42;
}

E o resultado foi o seguinte:

Benchmark

Repare na diferença: quase 15x a favor da classe sealed!

Por conta desta vantagem o time do .NET vem modificando e criando classes internas e privadas do runtime do .NET para sealed, de modo a melhorar seu desempenho -- aqui um post a respeito do assunto (em inglês).

Como regra do polegar, recomendaria o seguinte:

  • Se a classe é privada/interna e não é herdada, então sealed.
  • Se a classe é pública e não é desejável que ela seja herdada, então sealed.
  • De outro modo não faz sentido aplicar a palavra-chave.

Gostou? Me deixe saber pelos indicadores. Caso deseje, deixe um comentário ou me procure nas redes sociais.

Até a próxima!