<?xml version="1.0" encoding="utf-16"?><rss xmlns:a10="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Felipe Fujiy Pessoto</title><link>https://blog.fujiy.net/Feed/Rss20</link><description>Blog sobre .NET, C#, ASP.NET entre outras tecnologias de desenvolvimento de software</description><item><guid isPermaLink="false">11239</guid><link>https://blog.fujiy.net/postid/11239</link><title>[Update: Span&lt;T&gt;] - Evitando alocações de memória ao ler arquivos textos</title><description>&lt;p&gt;Com o release de hoje do Visual Studio 15.5, fiz uma vers&amp;atilde;o utilizando Span&amp;lt;T&amp;gt;, ainda n&amp;atilde;o &amp;eacute; poss&amp;iacute;vel ver suas vantagens pois&amp;nbsp;muitas APIs ainda n&amp;atilde;o aceitam o ReadOnlySpan&amp;lt;char&amp;gt; no lugar de strings, o que permitiria por exemplo chamar o int.TryParse diretamente (&lt;strong&gt;Update 2: Agora permitem, o codigo foi atualizado para refletir isso&lt;/strong&gt;). Com isso o Span&amp;lt;T&amp;gt; traria o melhor de todas as solu&amp;ccedil;&amp;otilde;es apresentadas, a simplicidade do Substring, com a performance dos ponteiros, sem utilizar o &lt;strong&gt;unsafe&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Ainda assim o Span&amp;lt;T&amp;gt; mostra que sua performance foi a melhor entre os m&amp;eacute;todos avaliados, sem alocar praticamente nenhuma mem&amp;oacute;ria:&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;[Benchmark]
private long Read_ResultSpan(bool stack)
{
    int bufferSize = GetLineSize();
    Span buffer = stack ? stackalloc char[bufferSize] : new char[bufferSize];
    long total = 0;

    TextReader sr = GetReader();
    {
        while (sr.Read(buffer) &amp;gt; 0)
        {
            int lastIndex = 0;

            for (int i = 0; i &amp;lt; positions.Length; i++)
            {
                ReadOnlySpan result = buffer.Slice(lastIndex, positions[i]);
                lastIndex += positions[i];
                total += int.Parse(result);
            }
        }
    }

    if (total != expected)
    {
        throw new Exception("Wrong result");
    }

    return total;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;E o resultado final:&lt;/p&gt;
&lt;table style="width: 875px; border-style: none; margin-left: auto; margin-right: auto;"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="width: 245px;"&gt;Method&lt;/th&gt;
&lt;th style="width: 96px;"&gt;Mean&lt;/th&gt;
&lt;th style="width: 64px;"&gt;Ratio&lt;/th&gt;
&lt;th style="width: 103px;"&gt;Gen 0/1k Op&lt;/th&gt;
&lt;th style="width: 82px;"&gt;Gen 1/1k Op&lt;/th&gt;
&lt;th style="width: 80px;"&gt;Gen 2/1k Op&lt;/th&gt;
&lt;th style="width: 159px;"&gt;Allocated Memory/Op&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="width: 245px;"&gt;Minimum&lt;/td&gt;
&lt;td style="width: 96px;"&gt;1.522 ms&lt;/td&gt;
&lt;td style="width: 64px;"&gt;0.002&lt;/td&gt;
&lt;td style="width: 103px;"&gt;-&lt;/td&gt;
&lt;td style="width: 82px;"&gt;-&lt;/td&gt;
&lt;td style="width: 80px;"&gt;-&lt;/td&gt;
&lt;td style="width: 159px;"&gt;0 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 245px;"&gt;ReadLine_ResultSubstring&lt;/td&gt;
&lt;td style="width: 96px;"&gt;662.002 ms&lt;/td&gt;
&lt;td style="width: 64px;"&gt;1.000&lt;/td&gt;
&lt;td style="width: 103px;"&gt;78000.0000&lt;/td&gt;
&lt;td style="width: 82px;"&gt;-&lt;/td&gt;
&lt;td style="width: 80px;"&gt;-&lt;/td&gt;
&lt;td style="width: 159px;"&gt;157 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 245px;"&gt;ReadLine_ResultCharArray&lt;/td&gt;
&lt;td style="width: 96px;"&gt;649.625 ms&lt;/td&gt;
&lt;td style="width: 64px;"&gt;0.981&lt;/td&gt;
&lt;td style="width: 103px;"&gt;78000.0000&lt;/td&gt;
&lt;td style="width: 82px;"&gt;-&lt;/td&gt;
&lt;td style="width: 80px;"&gt;-&lt;/td&gt;
&lt;td style="width: 159px;"&gt;157 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 245px;"&gt;Read_ResultCharArray&lt;/td&gt;
&lt;td style="width: 96px;"&gt;443.691 ms&lt;/td&gt;
&lt;td style="width: 64px;"&gt;0.670&lt;/td&gt;
&lt;td style="width: 103px;"&gt;57000.0000&lt;/td&gt;
&lt;td style="width: 82px;"&gt;-&lt;/td&gt;
&lt;td style="width: 80px;"&gt;-&lt;/td&gt;
&lt;td style="width: 159px;"&gt;114 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 245px;"&gt;Read_ResultCharArraySpan&lt;/td&gt;
&lt;td style="width: 96px;"&gt;390.457 ms&lt;/td&gt;
&lt;td style="width: 64px;"&gt;0.590&lt;/td&gt;
&lt;td style="width: 103px;"&gt;-&lt;/td&gt;
&lt;td style="width: 82px;"&gt;-&lt;/td&gt;
&lt;td style="width: 80px;"&gt;-&lt;/td&gt;
&lt;td style="width: 159px;"&gt;440 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 245px;"&gt;Read_ResultUseUnsafeCharPointer&lt;/td&gt;
&lt;td style="width: 96px;"&gt;551.917 ms&lt;/td&gt;
&lt;td style="width: 64px;"&gt;0.834&lt;/td&gt;
&lt;td style="width: 103px;"&gt;-&lt;/td&gt;
&lt;td style="width: 82px;"&gt;-&lt;/td&gt;
&lt;td style="width: 80px;"&gt;-&lt;/td&gt;
&lt;td style="width: 159px;"&gt;1824 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 245px;"&gt;Read_ResultSpanStackAlloc&lt;/td&gt;
&lt;td style="width: 96px;"&gt;369.504 ms&lt;/td&gt;
&lt;td style="width: 64px;"&gt;0.558&lt;/td&gt;
&lt;td style="width: 103px;"&gt;-&lt;/td&gt;
&lt;td style="width: 82px;"&gt;-&lt;/td&gt;
&lt;td style="width: 80px;"&gt;-&lt;/td&gt;
&lt;td style="width: 159px;"&gt;0 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 245px;"&gt;Read_ResultSpanCharArray&lt;/td&gt;
&lt;td style="width: 96px;"&gt;397.005 ms&lt;/td&gt;
&lt;td style="width: 64px;"&gt;0.600&lt;/td&gt;
&lt;td style="width: 103px;"&gt;-&lt;/td&gt;
&lt;td style="width: 82px;"&gt;-&lt;/td&gt;
&lt;td style="width: 80px;"&gt;-&lt;/td&gt;
&lt;td style="width: 159px;"&gt;360 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 245px;"&gt;Read_ResultSpanNative&lt;/td&gt;
&lt;td style="width: 96px;"&gt;376.109 ms&lt;/td&gt;
&lt;td style="width: 64px;"&gt;0.568&lt;/td&gt;
&lt;td style="width: 103px;"&gt;-&lt;/td&gt;
&lt;td style="width: 82px;"&gt;-&lt;/td&gt;
&lt;td style="width: 80px;"&gt;-&lt;/td&gt;
&lt;td style="width: 159px;"&gt;0 B&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="table-responsive"&gt;&amp;nbsp;&lt;/div&gt;
&lt;p&gt;O c&amp;oacute;digo est&amp;aacute; dispon&amp;iacute;vel em &lt;a href="https://github.com/felipepessoto/AvoidingStringAllocation"&gt;https://github.com/felipepessoto/AvoidingStringAllocation&lt;/a&gt;&lt;/p&gt;</description><a10:updated>2021-07-04T03:06:43Z</a10:updated></item><item><guid isPermaLink="false">11231</guid><link>https://blog.fujiy.net/postid/11231</link><title>O que há de novo no C# 7.0 - Pattern Matching</title><description>&lt;p&gt;Pattern&amp;nbsp;Matching &amp;eacute; uma nova estrutura na linguagem que permite testar um valor contra um determinado formato enquanto atribui seu resultado.&lt;/p&gt;
&lt;p&gt;Na vers&amp;atilde;o 7.0 do C# s&amp;atilde;o esperados tr&amp;ecirc;s patterns:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Constant - Testa a express&amp;atilde;o contra uma constante, isto &amp;eacute;, literais, vari&amp;aacute;vel &lt;em&gt;const&lt;/em&gt;, o valor de um enum ou typeof&lt;/li&gt;
&lt;li&gt;Type - Testa se uma express&amp;atilde;o &amp;eacute; de um determinado tipo e em caso de sucesso faz o cast para o tipo, atribuindo o resultado em uma vari&amp;aacute;vel&lt;/li&gt;
&lt;li&gt;Var - Esta express&amp;atilde;o sempre &amp;eacute; executada com sucesso, servindo apenas para atribuir o valor em uma nova vari&amp;aacute;vel&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;E mais est&amp;atilde;o por vir, no GitHub &amp;eacute; poss&amp;iacute;vel ler o &lt;a title="Pattern Matching for C#" href="https://github.com/dotnet/roslyn/blob/features/patterns/docs/features/patterns.md"&gt;documento sobre Pattern Matching&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Atualmente estes patterns podem ser utilizados nas express&amp;otilde;es &lt;strong&gt;is &lt;/strong&gt;e no &lt;strong&gt;case &lt;/strong&gt;do bloco switch.&lt;/p&gt;
&lt;h2&gt;Is Expressions&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;O principal uso nas express&amp;otilde;es is ser&amp;aacute; do Type Pattern, para atribuir uma variavel enquanto teste seu tipo. Por exemplo,&amp;nbsp;quando &amp;eacute; necess&amp;aacute;rio executar um m&amp;eacute;todo de uma classe derivada, em vez de:&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;Dog dog = animal as Dog;
if(dog != null)
{
    dog.Bark();
}

//Ou

if (animal is Dog)
{
    Dog dog = (Dog)animal;
    dog.Bark();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;Eacute; poss&amp;iacute;vel validar e atribuir em uma unica express&amp;atilde;o:&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;if (animal is Dog dog)
{
    dog.Bark();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Como muitos dos recursos s&amp;atilde;o apenas Syntactic Sugar, recomendo sempre avaliar qual a IL gerada, neste caso, &amp;eacute; equivalente ao seguinte c&amp;oacute;digo C#:&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;Dog dog;
if ((dog = (animal as Dog)) != null)
{
    dog.Bark();
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&amp;nbsp;Switch statements&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;Com o switch&amp;nbsp;fica ainda mais interessante&amp;nbsp;ao combinar as condi&amp;ccedil;&amp;otilde;es,&amp;nbsp;mantendo as regras separadas para cada caso e o c&amp;oacute;digo mais claro:&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;Animal animal = GetAnimal();

switch (animal)
{
    case Dog dog when dog.IsShortHaired:
        Console.WriteLine("Short Haired");
        break;
    case Dog dog:
        Console.WriteLine("Not Short Haired");
        break;
    case Cat cat:
        Console.WriteLine("Cat");
        break;
    case null:
        throw new ArgumentNullException();
    default:
        Console.WriteLine("Animal");
        break;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;O escopo de cada variavel atribuida no &lt;strong&gt;case&amp;nbsp;&lt;/strong&gt;&amp;eacute; restrita ao bloco em que foi declarado e pode ser utilizado para validar outras regras, como no exemplo o &lt;strong&gt;IsShortHaired&lt;/strong&gt;. Assim caso alguma valida&amp;ccedil;&amp;atilde;o n&amp;atilde;o seja feita com sucesso, o bloco n&amp;atilde;o &amp;eacute; executado e o pr&amp;oacute;ximo case &amp;eacute; avaliado.&lt;/p&gt;
&lt;p&gt;Outra mudan&amp;ccedil;a importante &amp;eacute; que agora o ordem dos case's &amp;eacute; validada na compila&amp;ccedil;&amp;atilde;o, impedindo que se use um case que inutilize os que est&amp;atilde;o abaixo dele, por exemplo:&lt;/p&gt;
&lt;p&gt;&lt;img src="../../../Upload/Post11231/CaseInvalido.png" /&gt;&lt;/p&gt;
&lt;p&gt;E o case default ser&amp;aacute; sempre executado por &amp;uacute;ltimo, n&amp;atilde;o importando o local em que foi declarado.&lt;/p&gt;</description><a10:updated>2016-12-14T02:48:02Z</a10:updated></item><item><guid isPermaLink="false">11238</guid><link>https://blog.fujiy.net/postid/11238</link><title>Evitando alocações de memória ao ler arquivos textos</title><description>&lt;p&gt;Esta &amp;eacute; uma tarefa comum, alguns processos de importa&amp;ccedil;&amp;atilde;o e exporta&amp;ccedil;&amp;atilde;o de dados usam colunas fixas, como alguns usados por bancos, por exemplos o CNAB.&lt;/p&gt;
&lt;p&gt;O processo de leitura parece simples e realmente &amp;eacute;. S&amp;oacute; precisamos tomar alguns cuidados, como n&amp;atilde;o ter ler todo o arquivo para a mem&amp;oacute;ria para ent&amp;atilde;o processar e guardar seu resultado,&amp;nbsp;o que poderia causar um OutOfMemoryException.&lt;/p&gt;
&lt;p&gt;De forma geral, bastaria algo como:&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;int[] positions = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

string[] result = new string[positions.Length];

using (StreamReader sr = new StreamReader("Data.txt"))
{
    string line;
    while ((line = sr.ReadLine()) != null)
    {
        int lastIndex = 0;

        for (int i = 0; i &amp;lt; positions.Length; i++)
        {
            result[i] = line.Substring(lastIndex, positions[i]);
            lastIndex += positions[i];
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Por&amp;eacute;m desta forma&amp;nbsp;s&amp;atilde;o alocadas diversas string para cada linha. Cada chamada ao m&amp;eacute;todo Substring, cria uma nova string.&lt;/p&gt;
&lt;p&gt;Assim, ao ler 1.000.000 de linhas, s&amp;atilde;o alocados cerca de 1121MB levando 1208ms.&lt;/p&gt;
&lt;p&gt;Ao realizar o profiling da aplica&amp;ccedil;&amp;atilde;o &amp;eacute; poss&amp;iacute;vel ver que a praticamente todo o tempo &amp;eacute; utilizado nos m&amp;eacute;todos ReadLine e Substring. (N&amp;atilde;o foi poss&amp;iacute;vel aguardar o fim da execu&amp;ccedil;&amp;atilde;o, com o profiler ativo ela fica muito mais lenta)&lt;/p&gt;
&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="../../../Upload/Post11238/ReadLineSubStringSampling.PNG" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Assim podemos tentar&amp;nbsp;otimizar estes dois pontos, o primeiro deles, o uso de Substring.&lt;/p&gt;
&lt;p&gt;Neste exemplo&amp;nbsp;criei duas solu&amp;ccedil;&amp;otilde;es, utilizando char[], no caso como s&amp;atilde;o diversas colunas, char[][]. A segunda op&amp;ccedil;&amp;atilde;o com ponteiros.&lt;/p&gt;
&lt;p&gt;Ambas tem resultados semelhantes, cada uma com seus pontos fortes e fracos. Ao utilizar ponteiro voc&amp;ecirc;&amp;nbsp;obrigatoriamente utiliza c&amp;oacute;digo marcado como &lt;strong&gt;unsafe&lt;/strong&gt;. E ao utilizar char[] n&amp;atilde;o &amp;eacute; poss&amp;iacute;vel utilizar as classes do .NET para fazer o Parse para int por exemplo, apesar de ser poss&amp;iacute;vel criar seu pr&amp;oacute;prio m&amp;eacute;todo, como o m&amp;eacute;todo privado do .NET:&amp;nbsp;&lt;a href="https://referencesource.microsoft.com/#mscorlib/system/number.cs,04291cc3a0b10032,references"&gt;https://referencesource.microsoft.com/#mscorlib/system/number.cs,04291cc3a0b10032,references&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ao executar o teste sem SubString diminuimos para 412MB alocados e 915ms de execu&amp;ccedil;&amp;atilde;o:&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;public void ReadLine_ResultCharArray()
{
    char[][] result = new char[positions.Length][];

    //Allocate char array of right size
    for (int i = 0; i &amp;lt; positions.Length; i++)
    {
        result[i] = new char[positions[i]];
    }

    using (TextReader sr = GetReader())
    {
        string line;
        while ((line = sr.ReadLine()) != null)
        {
            int lastIndex = 0;

            for (int i = 0; i &amp;lt; positions.Length; i++)
            {
                int fieldLength = positions[i];

                for (int j = 0; j &amp;lt; fieldLength; j++)
                {
                    result[i][j] = line[lastIndex + j];
                }

                lastIndex += fieldLength;
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Desta vez o profiling &amp;eacute; executado quase que de forma instant&amp;acirc;nea:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="../../../Upload/Post11238/ReadLineCharArraySampling.PNG" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Agora nosso foco &amp;eacute; o m&amp;eacute;todo ReadLine.&lt;/p&gt;
&lt;p&gt;A classe TextReader possui um m&amp;eacute;todo Read que permite que seja utilizado um buffer de char[], assim podemos usar este m&amp;eacute;todo para evitar aloca&amp;ccedil;&amp;otilde;es, criando um buffer do tamanho de uma linha e reutilizando at&amp;eacute; o final do processamento:&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;public void Read_ResultCharArray()
{
    int bufferSize = GetLineSize();
    char[] buffer = new char[bufferSize];
    char[][] result = new char[positions.Length][];

    //Allocate char array of right size
    for (int i = 0; i &amp;lt; positions.Length; i++)
    {
        result[i] = new char[positions[i]];
    }

    using (TextReader sr = GetReader())
    {
        while (sr.Read(buffer, 0, bufferSize) &amp;gt; 0)
        {
            int lastIndex = 0;

            for (int i = 0; i &amp;lt; positions.Length; i++)
            {
                int fieldLength = positions[i];

                for (int j = 0; j &amp;lt; fieldLength; j++)
                {
                    result[i][j] = buffer[lastIndex + j];
                }

                lastIndex += fieldLength;
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Diminuindo a aloca&amp;ccedil;&amp;atilde;o de mem&amp;oacute;ria para valores irris&amp;oacute;rios:&lt;/p&gt;
&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="../../../Upload/Post11238/ReadCharArraySampling.PNG" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Desta forma por&amp;eacute;m nosso resultado &amp;eacute; um array de char e n&amp;atilde;o string, impedindo o uso de alguns m&amp;eacute;todos como int.Parse. Para continuarmos com o resultado em string, &amp;eacute; poss&amp;iacute;vel utilizando ponteiros, como no exemplo:&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;public void Read_ResultUseUnsafeCharPointer()
{
    int bufferSize = GetLineSize();
    char[] buffer = new char[bufferSize];
    string[] result = new string[positions.Length];

    //Allocate empty strings of right size
    for (int i = 0; i &amp;lt; positions.Length; i++)
    {
        result[i] = new string(' ', positions[i]);
    }

    using (TextReader sr = GetReader())
    {
        while (sr.Read(buffer, 0, bufferSize) &amp;gt; 0)
        {
            int lastIndex = 0;

            for (int i = 0; i &amp;lt; positions.Length; i++)
            {
                int fieldLength = positions[i];

                unsafe
                {
                    fixed (char* chars = result[i])
                    {
                        for (int j = 0; j &amp;lt; fieldLength; j++)
                        {
                            chars[j] = buffer[lastIndex + j];
                        }
                    }
                }

                lastIndex += fieldLength;
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;O uso de mem&amp;oacute;ria e tempo de processamento &amp;eacute; semelhante ao usar char[][].&lt;/p&gt;
&lt;p&gt;Abaixo um sum&amp;aacute;rio com todos os testes realizados com 100 mil linhas:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="table-responsive"&gt;
&lt;table class="table table-striped table-bordered"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Mean&lt;/th&gt;
&lt;th&gt;StdErr&lt;/th&gt;
&lt;th&gt;StdDev&lt;/th&gt;
&lt;th&gt;Median&lt;/th&gt;
&lt;th&gt;Scaled&lt;/th&gt;
&lt;th&gt;Scaled-StdDev&lt;/th&gt;
&lt;th&gt;Gen 0&lt;/th&gt;
&lt;th&gt;Bytes Allocated/Op&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="info"&gt;
&lt;td&gt;GoStraightReadLine&lt;/td&gt;
&lt;td&gt;68.5477 ms&lt;/td&gt;
&lt;td&gt;0.4298 ms&lt;/td&gt;
&lt;td&gt;0.7444 ms&lt;/td&gt;
&lt;td&gt;68.7090 ms&lt;/td&gt;
&lt;td&gt;0.49&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;2,268.00&lt;/td&gt;
&lt;td&gt;101,400,456.33&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="info"&gt;
&lt;td&gt;GoStraightRead&lt;/td&gt;
&lt;td&gt;34.3965 ms&lt;/td&gt;
&lt;td&gt;0.3196 ms&lt;/td&gt;
&lt;td&gt;0.5535 ms&lt;/td&gt;
&lt;td&gt;34.4998 ms&lt;/td&gt;
&lt;td&gt;0.25&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;19,869.67&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="danger"&gt;
&lt;td&gt;ReadLine_ResultSubstring&lt;/td&gt;
&lt;td&gt;140.3299 ms&lt;/td&gt;
&lt;td&gt;0.0818 ms&lt;/td&gt;
&lt;td&gt;0.1416 ms&lt;/td&gt;
&lt;td&gt;140.3629 ms&lt;/td&gt;
&lt;td&gt;1.00&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;6,440.00&lt;/td&gt;
&lt;td&gt;284,255,469.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ReadLine_ResultCharArray&lt;/td&gt;
&lt;td&gt;101.1819 ms&lt;/td&gt;
&lt;td&gt;0.6428 ms&lt;/td&gt;
&lt;td&gt;1.1134 ms&lt;/td&gt;
&lt;td&gt;100.8166 ms&lt;/td&gt;
&lt;td&gt;0.72&lt;/td&gt;
&lt;td&gt;0.01&lt;/td&gt;
&lt;td&gt;2,275.00&lt;/td&gt;
&lt;td&gt;101,735,538.92&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ReadLine_ResultUseUnsafeCharPointer&lt;/td&gt;
&lt;td&gt;106.5311 ms&lt;/td&gt;
&lt;td&gt;0.2403 ms&lt;/td&gt;
&lt;td&gt;0.4162 ms&lt;/td&gt;
&lt;td&gt;106.3192 ms&lt;/td&gt;
&lt;td&gt;0.76&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;2,275.00&lt;/td&gt;
&lt;td&gt;101,738,164.83&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Read_ResultNewString&lt;/td&gt;
&lt;td&gt;109.9989 ms&lt;/td&gt;
&lt;td&gt;0.0806 ms&lt;/td&gt;
&lt;td&gt;0.1395 ms&lt;/td&gt;
&lt;td&gt;110.0615 ms&lt;/td&gt;
&lt;td&gt;0.78&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;4,165.00&lt;/td&gt;
&lt;td&gt;182,531,333.17&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Read_ResultUseUnsafeCharPointer&lt;/td&gt;
&lt;td&gt;80.7485 ms&lt;/td&gt;
&lt;td&gt;0.2625 ms&lt;/td&gt;
&lt;td&gt;0.4546 ms&lt;/td&gt;
&lt;td&gt;80.7316 ms&lt;/td&gt;
&lt;td&gt;0.58&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;24,451.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="success"&gt;
&lt;td&gt;Read_ResultCharArray&lt;/td&gt;
&lt;td&gt;77.3640 ms&lt;/td&gt;
&lt;td&gt;1.0972 ms&lt;/td&gt;
&lt;td&gt;1.9004 ms&lt;/td&gt;
&lt;td&gt;76.4365 ms&lt;/td&gt;
&lt;td&gt;0.55&lt;/td&gt;
&lt;td&gt;0.01&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;24,806.92&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;As duas primeiras linhas representam a leitura do arquivo, sem nenhum processamento. A terceira &amp;eacute; o primeiro exemplo e a &amp;uacute;ltima o &amp;uacute;ltimo exemplo&lt;/p&gt;</description><a10:updated>2016-12-02T21:56:55Z</a10:updated></item><item><guid isPermaLink="false">11236</guid><link>https://blog.fujiy.net/postid/11236</link><title>Application Insights ASP.NET Core SQL Dependency Track</title><description>&lt;p&gt;Application Insights for ASP.NET Core doesn't support Dependency Tracking:&lt;/p&gt;
&lt;blockquote&gt;Dependency tracking and performance counter collection are by default enabled in ASP.NET Core on .NET Framework (currently not supported in .NET Core) https://github.com/Microsoft/ApplicationInsights-aspnetcore/wiki/Dependency-Tracking-and-Performance-Counter-Collection&amp;nbsp;&lt;/blockquote&gt;
&lt;p&gt;So I created this library to automatically track your SQL queries and send to Application Insights.&lt;/p&gt;
&lt;p&gt;Setup:&lt;/p&gt;
&lt;p&gt;1-) Add &lt;a href="https://www.nuget.org/packages/Fujiy.ApplicationInsights.AspNetCore.SqlTrack/"&gt;Fujiy.ApplicationInsights.AspNetCore.SqlTrack&lt;/a&gt; package&lt;/p&gt;
&lt;p&gt;2-)&amp;nbsp;On your Configure method, add TelemetryClient parameter and add AiEfCoreLoggerProvider to ILoggerFactory:&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, TelemetryClient tc)
{
    loggerFactory.AddProvider(new AiEfCoreLoggerProvider(tc));
    ...&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then you can monitor the sql calls in each request and the most expensives:&lt;/p&gt;
&lt;p&gt;&lt;img style="float: left;" src="../../../Upload/Post11236/Capture.PNG" /&gt;&lt;img style="float: right;" src="../../../Upload/Post11236/Capture2.PNG" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="clear: both;"&gt;GitHub: &lt;a href="https://github.com/fujiy/Fujiy.ApplicationInsights.AspNetCore.SqlTrack"&gt;https://github.com/fujiy/Fujiy.ApplicationInsights.AspNetCore.SqlTrack&lt;/a&gt;&lt;/p&gt;</description><a10:updated>2016-12-02T21:56:29Z</a10:updated></item><item><guid isPermaLink="false">11235</guid><link>https://blog.fujiy.net/postid/11235</link><title>Tema do FujiyBlog em Bootstrap</title><description>&lt;p&gt;Aproveitando a atualiza&amp;ccedil;&amp;atilde;o do blog fiz uma mudan&amp;ccedil;a necess&amp;aacute;ria a muito tempo, passei a utilizar o Bootstrap para o design do blog.&amp;nbsp;Com uma cara mais simples, melhor adapt&amp;aacute;vel em dispositivos mobile e intuitivo.&lt;/p&gt;
&lt;p&gt;A se&amp;ccedil;&amp;atilde;o administrativa tamb&amp;eacute;m foi reformulada, acredito que muito mais f&amp;aacute;cil de usar e com design moderno:&lt;/p&gt;
&lt;p&gt;&lt;img src="../../../Upload/Post11235/FujiyBlogAdmin2.png" width="800" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Ainda h&amp;aacute; algumas p&amp;aacute;ginas a serem ajustadas, mas a maioria j&amp;aacute; foi atualizada. Estou usando por algum tempo e ficou muito mais pr&amp;aacute;tica.&lt;/p&gt;</description><a10:updated>2016-09-18T00:54:37Z</a10:updated></item><item><guid isPermaLink="false">11234</guid><link>https://blog.fujiy.net/postid/11234</link><title>FujiyBlog em ASP.NET Core</title><description>&lt;p&gt;Nos &amp;uacute;ltimos meses tenho feito algumas atualiza&amp;ccedil;&amp;otilde;es no FujiyBlog, a maior delas foi a convers&amp;atilde;o, ou melhor reescrita do seu c&amp;oacute;digo para funcionar com ASP.NET Core.&lt;/p&gt;
&lt;p&gt;A maior parte das funcionalidades j&amp;aacute; est&amp;atilde;o funcionando, outras ainda aguardando recursos que ainda n&amp;atilde;o foram implementados no ASP.NET Core, como o OutputCache, por&amp;eacute;m est&amp;aacute; bem est&amp;aacute;vel e pronto para o uso.&lt;/p&gt;
&lt;p&gt;As tecnologias em uso atualmente s&amp;atilde;o:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ASP.NET Core 1.0.1&lt;/li&gt;
&lt;li&gt;Entity Framework Core 1.0.1&lt;/li&gt;
&lt;li&gt;Bootstrap 3&lt;/li&gt;
&lt;li&gt;SQL Server/SQL CE&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Quem pretende mudar para o ASP.NET Core deve realmente se preperar para reescrever boa parte do c&amp;oacute;digo, muitas APIs mudaram e outra n&amp;atilde;o existem, mas vale a pena por tudo que est&amp;aacute; por vir e as melhorias que o ASP.NET Core traz, como performance, multiplataforma, etc.&lt;/p&gt;
&lt;p&gt;A p&amp;aacute;gina oficial continua em&amp;nbsp;&lt;a href="http://fujiyblog.com/"&gt;http://fujiyblog.com/&lt;/a&gt;&amp;nbsp;e o c&amp;oacute;digo fonte est&amp;aacute; no GitHub:&amp;nbsp;&lt;a href="https://github.com/fujiy/FujiyBlog"&gt;https://github.com/fujiy/FujiyBlog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;O blog &amp;eacute; comp&amp;aacute;tivel com Azure, eu uso WebApps e Azure SQL para hospeda-lo e planejo publicar um pacote para facilitar o uso e deploy.&lt;/p&gt;</description><a10:updated>2016-09-18T00:46:09Z</a10:updated></item><item><guid isPermaLink="false">11233</guid><link>https://blog.fujiy.net/postid/11233</link><title>O que há de novo no C# 7.0 - Literais binários</title><description>&lt;p&gt;Al&amp;eacute;m dos n&amp;uacute;meros decimais e hexadecimais, no C# 7.0 &amp;eacute; poss&amp;iacute;vel escrever usando nota&amp;ccedil;&amp;atilde;o bin&amp;aacute;ria:&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;class BinaryLiteral
{
    public static void Example()
    {
        int myValue = 0b1010;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Facilitando muito a cria&amp;ccedil;&amp;atilde;o de Flags&amp;nbsp;Enum:&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;public enum MyFlagsEnumCSharp60
{
    None = 0,
    Sunday = 1,
    Monday = 2,
    Tuesday = 4,
    Wednesday = 8,
    Thursday = 16,
    Friday = 32,
    Saturday = 64
}

public enum MyFlagsEnum2CSharp60
{
    None = 0,
    Sunday = 1,             // 1
    Monday = 1 &amp;lt;&amp;lt; 1,        // 2
    Tuesday = 1 &amp;lt;&amp;lt; 2,       // 4
    Wednesday = 1 &amp;lt;&amp;lt; 3,     // 8
    Thursday = 1 &amp;lt;&amp;lt; 4,      // 16
    Friday = 1 &amp;lt;&amp;lt; 5,        // 32
    Saturday = 1 &amp;lt;&amp;lt; 6,      // 64
}

public enum MyFlagsEnumCSharp70
{
    None =      0b00000000,
    Sunday =    0b00000001,
    Monday =    0b00000010,
    Tuesday =   0b00000100,
    Wednesday = 0b00001000,
    Thursday =  0b00010000,
    Friday =    0b00100000,
    Saturday =  0b01000000
}&lt;/code&gt;&lt;/pre&gt;</description><a10:updated>2016-09-14T17:39:38Z</a10:updated></item><item><guid isPermaLink="false">11232</guid><link>https://blog.fujiy.net/postid/11232</link><title>O que há de novo no C# 7.0 - Separador de dígitos</title><description>&lt;p&gt;Uma pequena mas util nova funcionalidade &amp;eacute; a possibilidade de utilizar separadores entre os d&amp;iacute;gitos, facilitando a leitura. Por exemplo:&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;class DigitSeparator
{
    public const int MyValue = 123_456;
    public const int MyHexValue = 0xAB_CD_EF;

    public static void Example()
    {
        Console.WriteLine(MyValue);
        Console.WriteLine(MyHexValue);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;N&amp;atilde;o h&amp;aacute; nenhuma diferen&amp;ccedil;a no c&amp;oacute;digo compilado com ou sem os separadores.&lt;/p&gt;</description><a10:updated>2016-09-14T17:42:26Z</a10:updated></item><item><guid isPermaLink="false">11229</guid><link>https://blog.fujiy.net/postid/11229</link><title>O que há de novo no C# 7.0 - Variáveis Out</title><description>&lt;p&gt;At&amp;eacute; o C# 6.0,&amp;nbsp;chamar um m&amp;eacute;todo que utiliza par&amp;acirc;metros out n&amp;atilde;o &amp;eacute; t&amp;atilde;o fluido, pois voc&amp;ecirc; precisa declarar as vari&amp;aacute;veis antes de chamar o m&amp;eacute;todo, e&amp;nbsp;nem &amp;eacute; poss&amp;iacute;vel usar o var j&amp;aacute; que normalmente n&amp;atilde;o se inicializa vari&amp;aacute;veis que s&amp;atilde;o&amp;nbsp;argumentos do m&amp;eacute;todo out.&lt;/p&gt;
&lt;p&gt;Ent&amp;atilde;o voc&amp;ecirc; precisa verificar quais os tipos das variaveis utilizadas nos parametros out, voltar e declarar antes do m&amp;eacute;todo:&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;public void OutVariablesExample60()
{
    int myX;//var myX doesn't work
    int myY;

    if(MethodOut(out myX, out myY))
    {
        Console.WriteLine(myX);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;No C# 7.0 esta experi&amp;ecirc;ncia ser&amp;aacute; melhorada, ao chamar o m&amp;eacute;todo voc&amp;ecirc; pode declarar as vari&amp;aacute;veis de forma inline. Com isso o compilador sabe os tipos delas, permitindo inclusive o uso do var:&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;public void OutVariablesExample70()
{
    if (MethodOut(out int myX, out var myY))
    {
        Console.WriteLine(myX);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As vari&amp;aacute;veis declaradas estar&amp;atilde;o no escopo do bloco onde o m&amp;eacute;todo &amp;eacute; chamado. No Preview 4 o compilador ainda restinge o escopo para o statement onde a vari&amp;aacute;vel foi declarada, por isso s&amp;oacute; funciona como no exemplo acima, onde temos um bloco IF. Esta restri&amp;ccedil;&amp;atilde;o ser&amp;aacute; removida at&amp;eacute; a vers&amp;atilde;o final.&lt;/p&gt;
&lt;p&gt;Sempre que novas funcionalidades s&amp;atilde;o acrescentadas acho interessante&amp;nbsp;verificar como o c&amp;oacute;digo IL &amp;eacute; gerado para saber como foi feita a implementa&amp;ccedil;&amp;atilde;o. Neste caso &amp;eacute; bem simples,&amp;nbsp;o novo c&amp;oacute;digo gera uma vers&amp;atilde;o identica ao exemplo em C# 6.0.&lt;/p&gt;</description><a10:updated>2016-09-14T17:43:18Z</a10:updated></item><item><guid isPermaLink="false">11228</guid><link>https://blog.fujiy.net/postid/11228</link><title>Livro - Desenvolvimento efetivo na plataforma Microsoft</title><description>&lt;p&gt;&lt;span style="font-size: 14px;"&gt;Com muita alegria que divulgo o lan&amp;ccedil;amento do livro, escrito pelo&amp;nbsp;time de Modern Apps. Todos os dias aprendo algo novo com eles e neste livro &amp;eacute; compartilhado a experi&amp;ecirc;ncia em DevOps, .NET, IIS e Microsoft Azure, ap&amp;oacute;s vivenciar diversos casos cr&amp;iacute;ticos nas maiores companhias do mundo.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h2&gt;&lt;span style="color: #000000;"&gt;&lt;a style="color: #000000;" href="https://www.casadocodigo.com.br/products/livro-plataforma-microsoft"&gt;Desenvolvimento efetivo na plataforma Microsoft&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt; &lt;h3&gt;&lt;span style="color: #000000;"&gt;&lt;a style="color: #000000;" href="https://www.casadocodigo.com.br/products/livro-plataforma-microsoft"&gt;Como desenvolver e suportar software que funciona&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;a href="https://www.casadocodigo.com.br/products/livro-plataforma-microsoft"&gt;&lt;img style="margin-right: auto; margin-left: auto; display: block;" src="../../../Upload/Post11228/livro.jpg" alt="" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;strong&gt;Sum&amp;aacute;rio&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Os Engenheiros de Suporte Microsoft em Modern Apps t&amp;ecirc;m a oportunidade de trabalhar com sistemas cr&amp;iacute;ticos nas maiores companhias do mundo dos mais diversos segmentos. Ao longo dos anos, estes profissionais qualificaram-se no desenvolvimento e suporte baseando-se nas recomenda&amp;ccedil;&amp;otilde;es dos produtos e em boas pr&amp;aacute;ticas vivenciadas nas experi&amp;ecirc;ncias de campo. Trabalhando lado a lado com os clientes, compartilhando conhecimento com milhares de times de desenvolvimento e auxiliando cada pessoa e cada organiza&amp;ccedil;&amp;atilde;o a atingir todo o seu potencial.&lt;/p&gt; &lt;p class="infoSection-texto"&gt;Com foco em DevOps, .NET Framework, IIS (Internet Information Services) e Microsoft Azure, desenvolvedores e arquitetos estar&amp;atilde;o aptos a aperfei&amp;ccedil;oar a qualidade e disponibilidade de seu software, aumentar seu n&amp;iacute;vel de maturidade em desenvolvimento, economizar tempo e reduzir custos.&lt;/p&gt; &lt;p class="infoSection-texto"&gt;&amp;nbsp;&lt;/p&gt; &lt;p class="infoSection-texto"&gt;Mais informa&amp;ccedil;&amp;otilde;es: &lt;a href="https://www.casadocodigo.com.br/products/livro-plataforma-microsoft"&gt;https://www.casadocodigo.com.br/products/livro-plataforma-microsoft&lt;/a&gt;&lt;/p&gt;</description><a10:updated>2016-05-06T23:18:27Z</a10:updated></item></channel></rss>