Se o desempenho deste código é crítico, então pode fazer sentido evitar alocações de heap para Candle s. Eu acho que a maneira mais razoável de fazer isso seria fazer Candle em uma estrutura. Embora os tipos de valor mutable sejam maus. Então eu também refatorei Candle para ser imutável. Isso também significa que a implementação do newestCandle teria que mudar, provavelmente em um par de campos duplos (ou, alternativamente, uma classe mutável e reinicializável separada). Não vejo nenhum outro problema potencial de desempenho em seu código. Mas quando se trata de desempenho, você sempre deve confiar no perfil, não na intuição (ou em alguém). Além disso, não gosto de alguns nomes de seus métodos. Especificamente: ValueUpdated. Os nomes dos métodos normalmente devem estar na forma de fazer algo, não aconteceu algo. Então eu acho que um nome melhor seria UpdateValue. Adicionar. Modificar. Estas são as duas operações fundamentais do seu MovingAverage e eu acho que esses nomes não expressam bem o significado. Eu os chamaria de algo como MoveAndSetCurrent e SetCurrent. respectivamente. Embora tal nomeação indique que as operações fundamentais deveriam ser Mover e Definir atual. Eu tenho uma quantidade de 4000 dados de stock e tring para calcular a média móvel para todos os valores de dados, mas como a média móvel é baseada em dados anteriores e não consigo calcular O SMA de 15 dias nos primeiros 14 dias, salte os primeiros 14 dias e calcule o SMA no resto dos dados. E tem que estar usando LINQ para realizar. Alguém pode dar uma amostra ou sugerir como usar o LINQ para calcular a média móvel. A saída para os valores médios é de cerca de 500, eu realmente não entendo como é possível obter esse valor alto. Movendo averager com matriz somas: 06072012 562,49 571,72 06082012 565,84 580,32 06112012 568,56 571,17 06122012 569,55 576,16 06132012 570,56 572,16 06142012 570,63 571,53 06152012 571,21 574,13 06182012 572,78 585,78 06192012 573,79 587,41 06202012 574,23 585,74 06212012 574,22 577,67 06222012 575,63 582,10 06252012 576,06 570,77 06262012 576,68 572,03 06272012 576,88 574,50 06282012 576,7 569,05 06292012 576,95 584,00 07022012 578,37 592,52 07032012 579,92 599,41 07032012 581,74 599,41 Editado por Leemx sexta-feira, 16 de novembro de 2012 2:59 Movido por Lisa Zhu Equipe de contingentes da Microsoft segunda-feira, 19 de novembro de 2012 7:38 linq related (From : Visual C General) Sexta-feira, 16 de novembro de 2012 2:42 AM Para criar uma média móvel, eu começaria por criar um intervalo de 0 a (comprimento da lista de dados - comprimento do período de movimento), então para cada valor no intervalo Selecione elementos x a x 43 comprimento do período de movimento e calcule a média. Tudo em uma boa declaração do LINQ: note que isso não é extremamente eficiente, já que você basicamente itera sobre a lista de dados por cada valor no intervalo .. Ei, veja Este sistema permite assinaturas de mais de 60 cha Editado por Arno Brouwer sexta-feira, novembro 23, 2012 4:42 PM Marcado como resposta por Alexander Sun sexta-feira, 7 de dezembro de 2012 2:44 am sexta-feira, 23 de novembro de 2012 16:41 Todas as respostas Uma amostra da sua declaração LINQ ajudaria. Otimização do tempo é a raiz de todo o mal. Knuth Para criar uma média móvel, eu começaria por criar um intervalo de 0 a (comprimento da lista de dados - comprimento do período de movimento), então, para cada valor no intervalo, selecione os elementos x Para x 43 comprimento do período de movimento e calcular a média. Tudo em uma boa declaração do LINQ: note que isso não é extremamente eficiente, já que você basicamente itera sobre a lista de dados por cada valor no intervalo .. Ei, veja Este sistema permite assinaturas de mais de 60 cha Editado por Arno Brouwer sexta-feira, novembro 23, 2012 4:42 PM Marcado como resposta por Alexander Sun sexta-feira, 7 de dezembro de 2012 2:44 am Sexta-feira, 23 de novembro de 2012 16:41 A Microsoft está realizando uma pesquisa on-line para entender sua opinião sobre o site da Msdn. Se você optar por participar, a pesquisa on-line será apresentada quando você deixar o site Msdn. Você gostaria de participar? Ajude-nos a melhorar o MSDN. Visite nossa página UserVoice para enviar e votar ideias. Centros Dev. Recursos de aprendizagem. Tenho um programa científico de registro de dados que eu tenho desenvolvido há vários anos. Agora precisamos adicionar algumas funcionalidades para que ela produza uma média móvel dos dados que estão sendo reunidos. Eu posso criar uma fila de myDataClass para fazer o buffer fifo, mas eu queria saber qual seria a melhor forma de fazer a média. Como você pode ver no exemplo de código abaixo, myDataClass contém várias estruturas de dados, algumas das quais podem ser calculadas em média e algumas que não podem (por exemplo, a string). A questão principal é se existe uma maneira fácil de conseguir isso ou preciso escrever código para calcular cada item dentro de myDataClass ou devo reformatar meuDataClass Obrigado. Terça-feira, 12 de julho de 2011 9:14 AM Pessoalmente, eu criaria uma classe quotDataQueue (de MyDataClass) que se desamarece se a contagem na fila passar 10 itens. Desta forma, você nunca terá que cuidar do número de item na fila do seu código, isso será cuidar da classe da fila Marcado como resposta por Mike Feng Moderador quarta-feira, 20 de julho de 2011 1:56 PM Terça-feira, 12 de julho de 2011 9h40 Depois de um pouco mais de investigação, acho que encontrei a solução para você. Você pode usar o método CopyTo para copiar os itens à esquerda na fila para uma matriz. Esteja ciente de que não calculo a média, eu mostrei apenas como você pode obter a base de seus cálculos, mas isso é apenas adicionar seus próprios cálculos com base em sua regra de negócios para isso. Marcado como resposta por Mike Feng Moderador quarta-feira, 20 de julho de 2011 1:56 PM sexta-feira, 15 de julho de 2011 5:16 AM Com base no meu entendimento, seu requisito é algo como isto: Este é o dado na fila: myDataClass1. Datadbl 2.1 datastr quotsomeString1quot dataarraydbl uma matriz dupla myDataClass2. Datadbl 3.5 datastr quotsomeString2quot dataarraydbl uma matriz dupla myDataClass10. Datadbl 9.1 datastr quotsomeString10quot dataarraydbl uma matriz dupla Agora, você deseja calcular o número médio de feild datadbl em cada objeto myDataClass e obter o número médio de dataarraydbl feild. Em caso afirmativo, sugerirei que você faça o mesmo que sugeriu Crazypenie: crie uma nova classe chamada DataQueue: Espero que isso seja útil, se eu não entendi nada, sinta-se à vontade para me informar. Mike Feng MSFT Suporte Comunidade MSDN Feedback para nós Obtenha ou solicite um exemplo de código da Microsoft Lembre-se de marcar as respostas como respostas se elas ajudarem e desmarcar se não fornecem ajuda. Marcado como resposta por Mike Feng Moderador quarta-feira, 20 de julho de 2011 1:55 PM sexta-feira, 15 de julho de 2011 3:33 AM Obrigado Cor, eu poderia fazê-lo assim, mas myDataClass é realmente bastante grande e o sistema de registro pode ser executado para Há muito tempo, por isso é mais eficiente para mim cópias de lixo da classe que na verdade não preciso para calcular a média. A fila parecia a maneira mais fácil de conseguir isso. Minha principal dúvida é que, como uma classe média como essa, recebo a sensação de que precisarei escrever código que especificamente para cada tipo de dados em myDataClass. Classe pública myDataClass terça-feira, 12 de julho de 2011 10:40 AM Com base no meu entendimento, seu requisito é algo como isto: Este é o dado na fila: myDataClass1. Datadbl 2.1 datastr quotsomeString1quot dataarraydbl uma matriz dupla myDataClass2. Datadbl 3.5 datastr quotsomeString2quot dataarraydbl uma matriz dupla myDataClass10. Datadbl 9.1 datastr quotsomeString10quot dataarraydbl uma matriz dupla Agora, você deseja calcular o número médio de feild datadbl em cada objeto myDataClass e obter o número médio de dataarraydbl feild. Em caso afirmativo, sugerirei que você faça o mesmo que sugeriu Crazypenie: crie uma nova classe chamada DataQueue: Espero que isso seja útil, se eu não entendi nada, sinta-se à vontade para me informar. Mike Feng MSFT Suporte Comunidade MSDN Feedback para nós Obtenha ou solicite um exemplo de código da Microsoft Lembre-se de marcar as respostas como respostas se elas ajudarem e desmarcar se não fornecem ajuda. Marcado como resposta por Mike Feng Moderador quarta-feira, 20 de julho de 2011 1:55 PM sexta-feira, 15 de julho de 2011 3:33
No comments:
Post a Comment