ReadAsBinaryString diz que os dados devem ser representados como uma string binária. Onde: cada byte é representado por um número inteiro no intervalo 0..255. JavaScript não tem um tipo binário e assim eles foram com um String com a garantia de que nenhum caractere armazenado no String seria fora do intervalo 0..255. (Eles poderiam ter ido com uma matriz de Números em vez disso, mas eles didnt talvez grandes Strings são mais memória eficiente do que grandes matrizes de números, uma vez que os números são ponto flutuante.) Se você está lendo um arquivo thats principalmente texto em um script ocidental Principalmente inglês, por exemplo), então essa string vai parecer muito com texto. Se você ler um arquivo com caracteres Unicode nele, você deve notar uma diferença, uma vez que as seqüências de caracteres JavaScript são UTF-16 (detalhes abaixo) e assim alguns caracteres terão valores acima de 255, enquanto uma seqüência binária de acordo com a especificação File API não teria Quaisquer valores acima de 255 (youd tem dois caracteres individuais para os dois bytes do ponto de código Unicode). Se você está lendo um arquivo thats não texto em tudo (uma imagem, talvez), você provavelmente ainda obter um resultado muito semelhante entre readAsText e readAsBinaryString. Mas com readAsBinaryString você sabe que não haverá qualquer tentativa de interpretar sequências de vários bytes como caracteres. Você não sabe que se você usar readAsText. Porque readAsText usará uma determinação de codificação para tentar descobrir o que é a codificação de arquivos e, em seguida, mapeá-lo para JavaScripts UTF-16 strings. Você pode ver o efeito se você criar um arquivo e armazená-lo em algo diferente de ASCII ou UTF-8. (No Windows você pode fazer isso através do bloco de notas o Salvar como como uma codificação drop-down com Unicode nele, pelo que olhando para os dados que parecem significar UTF-16 Im certeza Mac OS e nix editores têm um recurso semelhante.) Heres uma página que despeja o resultado da leitura de um arquivo em ambos os sentidos: Se eu usar isso com um Teste 1 2 3 arquivo armazenado em UTF-16, aqui estão os resultados que recebo: Como você pode ver, readAsText interpretou os personagens e então eu tenho 13 (o comprimento do teste 1 2 3), e readAsBinaryString didnt, e assim eu tenho 28 (a BOM de dois bytes mais dois bytes para cada caractere). JavaScript cordas são UTF-16 pode parecer uma afirmação estranha Arent eles só Unicode Não, uma cadeia de JavaScript é uma série de UTF-16 unidades de código que você vê pares substitutos como dois personagens JavaScript individuais, embora, de fato, a par substituto como um Todo é apenas um personagem. Consulte o link para obter detalhes. DigitalFresh: A string é os dados binários. Como você estava comentando, eu postei um exemplo que pode ajudar. O JavaScript não tem um tipo quotbinaryquot e assim eles foram com um String com a garantia de que nenhum caractere armazenado na string estaria fora do intervalo 0..255. (Eles poderiam ter ido com uma matriz de números em vez disso, mas eles didn39t.) O exemplo mostra como obter o valor bruto de um quotcharacterquot da seqüência de caracteres. Ndash T. J. Porque este material é assíncrono, não pode lançar exceções que você precisa olhar para a interface para ver se há alguma forma assíncrona que relata erros. E, de fato, FileReader tem onerror para isso. Quando você usa um arquivo: 4747 URL, o seu domínio do documento é nulo, que tende a fechar você fora de um monte de coisas (eu don39t saber os detalhes, eu nunca fazê-lo), esp. Quando o SOP entra nele. I39m com certeza ele é até o navegador, pelo menos por enquanto, como a parte de segurança da especificação ainda é provisória: w3.org/TR/FileAPI/security-discussion Mas eu wouldn39t esperar que ele funcione. Ndash T. J. Muitos agradecimentos TJCrowder - Eu deletei meu comentário para evitar que outros se deixem enganar por minha simplificação excessiva, e obrigado por postar os detalhes - Estou certo de que os outros acharão seus comentários muito mais úteis (e lendo o Artigo é realmente uma boa idéia, como você diz, se um é mucking ao redor nesta área). Ndash Brian M. Hunt Dezembro 30 14 at 14: 16Binary Options Trading Basta fazer uma previsão de se uma taxa de pares de moeda (por exemplo, EURUSD) vai subir ou cair. Uma previsão correta permitirá que você ganhe Você pode abrir opções com um período de validade de 30 segundos. Se a sua previsão para a opção está certo, o lucro sobre ele será de até 90 dos fundos investidos. Como tal, investir 100 USD neste caso veria você receber 190 USD (investimento mais proft). Vantagens das Opções Binárias com Alpari Alpari: Finanças Magnates Prêmios 2015 Vencedor na nomeação para Melhor Broker de Opções Binárias Rápido Você pode ganhar de negociação de opções binárias em apenas 30 segundos. Simples Você só precisa selecionar corretamente a direção que o preço da opção binária está indicando: CALL ou PUT. Acessível Para iniciar a negociação é fácil O custo mínimo de uma opção na plataforma BinaryTrader é de apenas 1 USD. Transparente O tamanho do lucro potencial para todas as opções binárias é mostrado com antecedência. Não há comissões ocultas. Receba tudo o que você ganhou. Você está pronto para ganhar dinheiro real Abra uma conta agora Participe do nosso concurso King of the Hill Ganhe ainda mais das opções binárias Os retornos indicados para opções binárias e também os retornos anteriores não são garantia de retornos futuros. O tamanho do lucro potencial de uma opção binária é variável e depende da situação do mercado. Em mercados finos ou rápidos, as condições de negociação podem ser alteradas e alguns tipos de opções ou prazos podem ser inacessíveis. Como parte de uma série de artigos estou discutindo alguns dos desafios que enfrentei ao tentar construir um editor de ícones on-line gratuito HTML5 e JavaScript . Eu queria que os usuários fossem capazes de abrir e editar arquivos de ícones existentes no meu editor de ícones. Como os arquivos de ícones podem conter vários quadros, eu precisava acessar esses quadros individuais para que eles pudessem ser exibidos e disponíveis para edição para o usuário. O número, tamanho e localização dos quadros contidos em um ícone são todos armazenados no cabeçalho do ícone. O cabeçalho do ícone é um bytes de coleção localizado no início de um arquivo de ícone, então eu precisava ler os dados binários contidos no arquivo. Agora podemos ler arquivos facilmente no navegador sem precisar enviar nenhum dado para um servidor. Nesta edição eu mostro como você pode ler dados binários de um arquivo local no navegador usando a API de Arquivo HTML5. Para começar, estávamos indo para adicionar um elemento de entrada e definir o atributo de tipo para o arquivo, em seguida, em um bloco de script que vamos lidar com o arquivo de entradas evento onchange. lt corpo gt160160160160160160160160160160160160160160160160160160160160160160160160160160160160 160.160.160.160 lt tipo ID de entrada quotbrowseOpenquot quotfilequot / gt 160.160.160.160 lt script type quottext / javascriptquot gt 160160160160160160160160 var FileInput document. getElementById (quotbrowseOpenquot) 160160160160160160160160 função fileInput. onchange () 160160160160160160160160160160160160 // código para lidar com onchange evento vai aqui 160160160160 160160160160 160160160160 lt / Script gt lt / body gt Agora precisamos adicionar o código para lidar com o evento onchange. Aqui vamos criar um objeto FileReader. Usaremos o método readAsBinaryString do objeto FileReader que nos dará os dados binários brutos. Podemos passar um objeto File para o readAsBinaryString se quisermos ler o arquivo inteiro ou podemos passar um objeto Blob se quisermos apenas ler uma determinada seção de um arquivo. Neste exemplo, vamos passar um objeto File para ler o arquivo inteiro. Nós também precisamos lidar com o evento onloadend do FileReader como os dados que lemos com readAsBinaryString só está disponível para usar uma vez que o arquivo inteiro ou blob foi lido pelo FileReader. Nosso código no manipulador de eventos onchange agora se parece com isso. 160160160160160160160160 var fr () 160160160160160160160160 função fr. onloadend nova FileReader () 160160160160160160160160160160160160 // código para lidar com onloadend evento 160.160.160.160 160.160.160.160 160160160160160160160160 fr. readAsBinaryString (este. files 0) No manipulador de eventos onloadend podemos acessar os dados que acaba de ser lido através O atributo de resultado FileReaders. Podemos então loop através do atributo de resultado e chamar o método charCodeAt para retornar um valor inteiro de cada byte. Neste exemplo estou indo para converter o byte para uma representação de seqüência hexadecimal usando toString (16), construir uma seqüência de caracteres longa e exibir a seqüência de caracteres para o usuário. Aqui está o exemplo completo de trabalho. lt DOCTYPE cabeça gt HTML lt html gt lt gt título 160160160160 lt gtReading dados binários com a API de arquivo e JavaScriptlt / title gt lt / head gt160160160160160160160160160160160160160160160160160160160160160160160160160160160160 corpo gt lt 160160160160 lt tipo ID de entrada quotbrowseOpenquot quotfilequot / gt 160160160160 lt script type quottext / javascriptquot gt 160160160160160160160160 var FileInput document. getElementById (quotbrowseOpenquot) 160160160160160160160160 função fileInput. onchange () 160160160160160160160160160160160160 var fr nova FileReader () 160160160160160160160160160160160160 função fr. onloadend () 160160160160160160160160160160160160160160160160 var resultado deste. result 160160160160160160160160160160160160160160160160 var hex quotquot 160160160160160160160160160160160160160160160160 for (var i 0 i lt esta. result. length i) 160160160160160160160160160160160160160160160160160160160160 var byteStr result. charCodeAt (i).toString (16) 160160160160160160160160160160160160160160160160160160160160 if (byteStr. length lt 2) 160160160160160160160160160160160160160160160160160160160160160160160160 byteStr quot0quot byteStr 160160160160160160160160160160160160160160160160160160160160 160160160160160160160160160160160160160160160160160160160160 hex quot quot byteStr 160160160160160160160160160160160160160160160160 160160160160160160160160160160160160160160160160 alerta (hex) 160160160160160160160160160160160160 160160160160160160160160160160160160 fr. readAsBinaryString (isto. files 0) gt 160160160160160160160160 160.160.160.160 lt / script gt lt / body lt / html gtTable de Conteúdo localizações: Leitura de arquivos em JavaScript usando o APIs File Table of Contents localizações seu navegador pode não suportar a funcionalidade neste artigo. Introdução O HTML5 finalmente fornece uma maneira padrão de interagir com arquivos locais, por meio da especificação da API de Arquivos. Como exemplo de suas capacidades, a API de Arquivo pode ser usada para criar uma pré-visualização em miniatura de imagens enquanto elas estão sendo enviadas para o servidor ou permitir que uma aplicação salve uma referência de arquivo enquanto o usuário estiver offline. Além disso, você pode usar a lógica do lado do cliente para verificar se um uploads mimetype corresponde à sua extensão de arquivo ou restringir o tamanho de um upload. A especificação fornece várias interfaces para acessar arquivos de um sistema de arquivos local: Arquivo - um arquivo individual fornece informações somente leitura, como nome, tamanho do arquivo, mimetype e uma referência ao identificador de arquivo. FileList - uma seqüência semelhante a uma matriz de objetos File. (Pense em multiplexar tipo de arquivo ltinput ou arrastando um diretório de arquivos da área de trabalho). Blob - Permite cortar um arquivo em intervalos de bytes. Quando usado em conjunto com as estruturas de dados acima, a interface FileReader pode ser usada para ler de forma assíncrona um arquivo através de manipulação de eventos JavaScript familiar. Assim, é possível monitorar o progresso de uma leitura, detectar erros e determinar quando uma carga está completa. De muitas maneiras, as APIs se assemelham ao modelo de evento XMLHttpRequest s. Selecionando arquivos A primeira coisa a fazer é verificar se o seu navegador suporta totalmente a API de arquivos: É claro que, se o aplicativo usar apenas algumas dessas APIs, modifique este snippet de acordo. Usando a entrada de formulário para seleção A maneira mais simples de carregar um arquivo é usar um elemento de tipo de arquivo de tipo ltinput padrão. O JavaScript retorna a lista de objetos File selecionados como FileList. Heres um exemplo que usa o atributo múltiplo para permitir selecionar vários arquivos de uma só vez: Exemplo. Usando entrada de formulário para seleção. Experimentá-lo Usando arraste e solte para selecionar Outra técnica para carregar arquivos é nativo arrastar e soltar da área de trabalho para o navegador. Podemos modificar o exemplo anterior ligeiramente para incluir suporte de arrastar e soltar. Exemplo. Usando arraste e solte para selecionar. Experimente-o Soltar arquivos aqui Nota: Alguns navegadores tratam elementos de tipo de arquivo de ltinput como destinos de queda nativos. Tente arrastar arquivos para o campo de entrada no exemplo anterior. Leitura de arquivos Agora vem a parte divertida Depois de ter obtido uma referência de arquivo, instanciar um objeto FileReader para ler seu conteúdo na memória. Quando a carga terminar, o evento leitores onload é disparado e seu atributo de resultado pode ser usado para acessar os dados do arquivo. FileReader inclui quatro opções para ler um arquivo, de forma assíncrona: FileReader. readAsBinaryString (BlobFile) - A propriedade de resultado conterá os dados de arquivo / blobs como uma seqüência de caracteres binária. Cada byte é representado por um inteiro no intervalo 0..255. FileReader. readAsText (BlobFile, optencoding) - A propriedade de resultado conterá os dados do arquivo / blobs como uma string de texto. Por padrão, a string é decodificada como UTF-8. Use o parâmetro de codificação opcional pode especificar um formato diferente. FileReader. readAsDataURL (BlobFile) - A propriedade de resultado conterá os dados de arquivo / blobs codificados como um URL de dados. FileReader. readAsArrayBuffer (BlobFile) - A propriedade de resultado conterá os dados de arquivo / blobs como um objeto ArrayBuffer. Uma vez que um desses métodos de leitura é chamado no seu objeto FileReader, o onloadstart. em progresso. carregando. Em cima. Onerror E onloadend pode ser usado para acompanhar o seu progresso. O exemplo abaixo filtra as imagens da seleção de usuários, chama reader. readAsDataURL () no arquivo e processa uma miniatura configurando o atributo src para um URL de dados. Exemplo. Leitura de arquivos. Experimente este exemplo com um diretório de imagens Cortando um arquivo Em alguns casos, a leitura do arquivo inteiro na memória não é a melhor opção. Por exemplo, digamos que você queria escrever um upload de arquivo assíncrono. Uma maneira possível de acelerar o upload seria ler e enviar o arquivo em pedaços de intervalo de bytes separados. O componente do servidor seria então responsável pela reconstrução do conteúdo do arquivo na ordem correta. Sorte para nós, a interface de arquivo suporta um método de fatia para suportar este caso de uso. O método toma um byte de partida como seu primeiro argumento, terminando o byte como seu segundo e uma string de tipo de conteúdo de opção como um terceiro. O exemplo a seguir demonstra a leitura de blocos de um arquivo. Algo que vale a pena notar é que ele usa o onloadend e verifica o evt. target. readyState em vez de usar o evento onload. Exemplo. Cortar um arquivo. Experimente Ler bytes: 1-5 6-15 7-8 arquivo inteiro Monitorando o progresso de uma leitura Uma das coisas agradáveis que obtemos gratuitamente ao usar manipulação de eventos assíncronos é a capacidade de monitorar o progresso do arquivo lido útil para Grandes arquivos, captura de erros e descobrir quando uma leitura está completa. Os eventos onloadstart e onprogress podem ser usados para monitorar o progresso de uma leitura. O exemplo abaixo demonstra exibir uma barra de progresso para monitorar o status de uma leitura. Para ver o indicador de progresso em ação, tente um arquivo grande ou um de uma unidade remota. Exemplo. Monitorando o progresso de uma leitura. Experimente Dica. Para realmente ver este indicador de progresso em ação, tente um arquivo grande ou um recurso em uma unidade remota. Next stepsPerformance of Javascript (Binário) Byte Arrays em Modern Browsers Um pouco mais de um ano atrás, eu comecei o projeto noVNC, um cliente HTML5 VNC. NoVNC faz um monte de processamento de dados de matriz binário byte e assim o desempenho da matriz é um grande preditor de desempenho noVNC global. Eu tinha grandes esperanças de que um dos novos tipos de dados binários byte matriz acessível a Javascript (em navegadores modernos) iria dar noVNC um grande impulso de desempenho. Neste post eu descrevo alguns dos meus resultados de testar esses tipos de matriz de bytes binários. Depois de ler o título, você pode ter pensado: Espere. Javascript não tem matrizes de bytes binários. Na verdade, não só o Javascript tem acesso a matrizes de bytes binários, mas existem duas variantes exclusivas disponíveis (tecnicamente nem fazem parte do ECMAScript ainda). Lista de salto: As Opções de Matrizes Arrays: Aqueles que seguem o desenvolvimento do navegador e padronização HTML já pode estar ciente de um desses tipos de matriz. ArrayBuffers (tecnicamente: Matrizes Matrizes) são uma parte obrigatória dos padrões propostos de WebGL e File API. Para usar um ArrayBuffer como uma matriz de bytes você cria uma exibição Uint8Array do ArrayBuffer. O JavaScript a seguir cria uma exibição ArrayBuffer que contém 1000 elementos de bytes não assinados que são inicializados em 0: Arrays ImageData: Mas existe um formulário mais antigo e mais amplamente suportado de arrays de bytes binários disponíveis para programas de JavaScript: ImageData. ImageData é um tipo de dados que é definido como parte do contexto 2D do elemento Canvas. ImageData é criado sempre que o método getImageData ou createImageData é invocado em um contexto Canvas 2D. O atributo de dados de um objeto ImageData é uma matriz de bytes que é 4 vezes maior que a altura de largura solicitada (4 bytes de R, G, B, A para cada pixel). O JavaScript a seguir cria uma matriz de bytes ImageData com 1000 elementos de bytes não assinados que são inicializados em 0: Soluções Tradicionais: Existem duas formas tradicionais de representar dados de byte binário em Javascript. O primeiro é com uma matriz JavaScript normal onde cada elemento da matriz é um número no intervalo de 0 a 255. O segundo método está usando uma seqüência de caracteres em que os valores de 0 a 255 são armazenados como caracteres Unicode na seqüência de caracteres e ler usando o charCodeAt Método. Para este post eu vou ignorar o método de seqüência de caracteres desde seqüências de caracteres Javascript são imutáveis e atualizar um único caractere em uma seqüência de caracteres JavaScript implica reconstruir toda a seqüência de caracteres que é desagradável e lento. O seguinte cria uma matriz JavaScript normal com 1000 números que são inicializados para 0: The Bad News Temos três métodos para representar dados de bytes binários: matrizes de Javascript normais, matrizes ImageData e arrays ArrayBuffer. Pode-se esperar que, uma vez que as matrizes ImageData e ArrayBuffer são de tamanho fixo, possuem elementos com um tipo fixo e são usadas para operações sensíveis ao desempenho (telas 2D e WebGL) que o desempenho desses arrays de bytes nativos seria melhor do que os arrays Javascript normais para a maioria operações. Infelizmente, a partir de hoje, a maioria das operações são mais lentas ao usar esses tipos de matriz de bytes. Testando Originalmente eu planejava mostrar os números de desempenho comparando navegadores em Linux e Windows. No entanto, descobri que há pouca diferença (para esses testes de matriz) entre a mesma versão de um navegador em execução no Windows vs Linux. Como todos os navegadores Linux também são executados no Windows (mas não vice-versa), tenho limitado os resultados de desempenho para o Windows. Para este post eu tenho hackeado quatro testes rápidos para comparar arrays de JavaScript normais com arrays ImageData e ArrayBuffer. Todos os testes usam matrizes que contêm 10240 elementos (10 1024) e repetem a operação que está sendo testada muitas vezes para empurrar os tempos de teste para uma faixa mais facilmente medida e comparável. Cada teste também é executado 10 vezes (iterações) ea média e desvio padrão em todas as 10 iterações é calculado. Você pode executar testes você mesmo clonando o repositório noVNC e carregando a página de testes / arrays. Estes resultados de teste são baseados na revisão bbee8098 de noVNC. Executando o teste em um navegador será saída JSON dados no textarea resultados. Esses dados JSON podem então ser combinados com dados JSON de outros resultados do navegador e executados através do script utils / json2graph. py python que usa o módulo matplotlib para gerar os gráficos. A máquina de teste tem as seguintes especificações: Acer Aspire 5253-BZ893 AMD Dual-Core C50 a 1GHz 3GB DDR3 Memória AMD Radeon HD 6250 Windows 7 Aqui estão os principais navegadores que foram testados: Além disso, versões mais antigas do navegador também foram testadas para ver se Os navegadores estão fazendo progressos: Chrome 9.0.597.98 Chrome 10.0.648.204 Chrome 11.0.673.0 (versão 75038) IE 9.0 Platform Preview 7 Firefox 3.6.13 Firefox 3.6.16 Firefox 4.0 beta 11 Por favor, note que eu não sou um testador de desempenho profissional tão Eu provavelmente não fizeram uso de ótimas técnicas de teste e há certamente uma possibilidade que eu cometi erros que invalidam alguns ou todos os números. Congratulo-me com críticas construtivas e diálogo para que eu possa expandir e melhorar esses resultados no futuro. Os Quatro Testes: create - Para cada iteração de teste, uma matriz é criada e inicializada para zero e isso é repetido 2000 vezes. RandomRead - Para cada iteração de teste, 5 milhões de leituras são emitidas para locais pseudo-aleatórios em uma matriz. SequentialRead - Para cada iteração de teste, 5 milhões de leituras são emitidas seqüencialmente para uma matriz. As leituras fazem um loop em torno do início da matriz quando chegam ao final da matriz. Para cada iteração de teste, 5 milhões de atualizações são feitas sequencialmente para uma matriz. As gravações contornam o início da matriz quando atingem o fim da matriz. Resultados do teste: Primeiro vamos dar uma olhada em como os diferentes tipos de matriz executar nos testes diferentes. Criar Resultados de Teste Este é o único teste em que os arrays ImageData e ArrayBuffer têm uma vantagem significativa de desempenho porque são inicializados automaticamente para 0 quando criados. O IE 9 eo Opera não suportam atualmente arrays ArrayBuffer. Resultados de teste de leitura aleatória O Chrome eo Opera têm o melhor desempenho geral, embora o Opera ainda não suporte os arrays ArrayBuffer. O Firefox tem um desempenho de leitura aleatória particularmente ruim. Os resultados mostram que há pouca vantagem em usar matrizes ImageData ou ArrayBuffer para leituras aleatórias e seu desempenho no Chrome e Opera é significativamente mais lento. Resultados de teste de leitura sequencial Para o teste de leitura seqüencial, a situação é bem diferente. O Firefox tem um desempenho consistente e líder em todos os tipos de matriz. O Chrome tem um desempenho pior em ordem de grandeza para matrizes ImageData e ArrayBuffer. Opera 11 mostram uma queda de 3X no desempenho para matrizes ImageData em comparação com matrizes Javascript normais. As matrizes normais são ainda a melhor escolha global. Resultados do Teste de Gravação Seqüencial Os resultados relativos ao teste de escrita sequencial são muito semelhantes às leituras sequenciais com uma desaceleração em toda a placa. O Firefox novamente mostra desempenho comparável em todos os três tipos de matriz. Opera 11 continua a mostrar uma queda de 3X no desempenho com matrizes ImageData. O Chrome continua a mostrar uma ordem de magnitude de velocidade diferente entre arrays normais e os arrays binários. Agora, vamos cortar os dados de forma diferente para ver como os diferentes navegadores comparam entre os diferentes tipos de matriz. Resultados de Teste de Array Normal O Chrome é o melhor intérprete geral aqui com o Opera a fechar em segundo lugar. No entanto, o resultado mais notável nesta visão é o desempenho terrível de leituras aleatórias do Firefox. Dada a enorme quantidade de jitter no Firefox resultado em comparação com os outros, o meu palpite é que este é um caso degenerado e que a Mozilla tem algumas frutas baixas pendurado aqui. Resultados do teste ImageData O Opera é agora o vencedor do desempenho geral com o Chrome puxando um segundo próximo. O problema do Firefox com leituras aleatórias continua a aparecer com matrizes ImageData (embora desta vez sem o jitter). Excluindo o resultado de leitura aleatória, o Firefox seria o vencedor claro. IE 9 tem uma boa exibição aqui chegando em um próximo terceiro geral. Resultados do teste do ArrayBuffer O pacote aumenta consideravelmente desde que apenas o Chrome e o Firefox suportam ArrayBuffers. Mais uma vez o Firefox mostra desempenho de leitura aleatória pessimal. Com esse resultado excluído (ou fixo), o Firefox seria o claro vencedor contra o Chrome. Resumo do resultado do teste: O Chrome tem o melhor desempenho geral para as matrizes normais. O Opera tem o melhor desempenho geral para matrizes ImageData com o Chrome um segundo próximo. O Firefox tem bom desempenho, exceto para leituras aleatórias, onde o desempenho cai de um penhasco em todos os tipos de matriz. Melhorias / Regressões do Navegador Agora vamos comparar algumas versões mais antigas do navegador para ver se os fornecedores do navegador estão fazendo progressos ao longo do tempo para melhorar o desempenho dos tipos de matriz de bytes binários. Firefox Normal Array Resultados de teste para Firefox Firefox mostra principalmente melhora constante para arrays normais, mas mais uma vez o terrível leitura aleatória levará sua cabeça na mudança de 4.0 beta 11 para a versão 4.0. Resultados do teste ImageData para o Firefox Novamente, o Firefox mostra maior melhora contínua para matrizes ImageData. Desta vez, o terrível desempenho de leitura aleatória foi introduzido em algum lugar entre o Firefox 3 e Firefox 4 base de código. Resultados de teste do ArrayBuffer para Firefox Somente o Firefox 4 suporta arrays ArrayBuffer. O desempenho de leitura aleatório terrível ainda existe. Resultados de teste do Chrome Normal Array para o Chrome Não há tendências fortes nos dados do Chrome para as matrizes normais. A velocidade de criação de array mostra uma queda significativa no Chrome 12. Para gravações sequenciais houve uma regressão 2X para o Chrome 10 e 11. Resultados do teste ImageData para o Chrome Parece haver uma regressão significativa no Chrome 12 relacionada ao desempenho do ImageData. A quantidade de dropoff (3X a 6X) eo jitter significativo indicam-me que seu é um propblem óbvio que deve ser fixado. Resultados de teste do ArrayBuffer para o Chrome Não há tendências fortes no desempenho do array do ArrayBuffer do Chrome, embora pareça haver uma tendência fraca para um desempenho pior. IE 9 Resultados de teste de matriz normal para Internet Explorer ImageData resultados de teste para o Internet Explorer A versão final do IE9 mostra uma diminuição de desempenho enorme em comparação com o Platform Preview 7. Se a Microsoft é capaz de recuperar esse desempenho em uma versão posterior, Do IE 9 em relação aos outros navegadores modernos. Considerações finais As matrizes ImageData e ArrayBuffer possuem diferentes características de desempenho nos mesmos navegadores. Não tenho certeza por isso deve ser o caso. Na verdade, eu recomendo que o WHATWG / W3C e vendedores de navegador padronizar em ArrayBuffers para ambos os propósitos. Isso pode ser feito adicionando um atributo adicional ao objeto ImageData talvez chamado buffer. O novo atributo de buffer seria um ArrayBuffer genérico contendo a memória de dados de imagem. O atributo de dados existente se tornaria uma exibição Uint8Array do ArrayBuffer (isso manteria compatibilidade com versões anteriores). Além da consolidação de código dentro dos navegadores (e um lugar para focar o esforço de otimização), essa mudança permitiria aos desenvolvedores criar uma visualização Uint32Array do buffer que permitiria atualizações inteiras de pixels (3 cores alfa) com uma operação. Usando as matrizes ImageData e ArrayBuffer (matriz com matriz) arrays geralmente não dão melhor desempenho para dados de byte binário do que apenas usando arrays Javascript normais. Isso é lamentável, uma vez que esses tipos de matriz binária existem especificamente para servir a funcionalidade sensível ao desempenho (gráficos 2D e 3D). É também surpreendente uma vez que têm um tamanho fixo e um tipo de elemento fixo que, em teoria, deveria permitir acesso mais rápido de leitura e escrita aos elementos. Eu suspeito (e espero) que este problema de desempenho é devido ao fato de que não o suficiente esforço de otimização foi aplicado por qualquer um dos vendedores de navegador para esses arrays binários. Solicitações: Mozilla, Google (e Apple), Microsoft e Opera: por favor, gaste algum esforço para otimizar seus tipos de matriz binária JavaScript Microsoft e Opera: seria bom se você implementasse WebGL. Mas se não, por favor, pelo menos, implementar array matriz (ArrayBuffer) de apoio, uma vez que está em seu próprio e provavelmente será usado em um futuro próximo em outros lugares onde faz sentido, como FileReader objetos e na WebSocket API para suportar dados binários. Posts de Acompanhamento: As guerras de navegador estão de volta e novas versões de navegadores estão sendo lançadas a cada poucas semanas. Meu plano é continuar atualizando esses testes para incluir as versões de navegador mais recentes. Eu também gostaria de expandir os testes para incluir um teste de escrita aleatória e também para testar o desempenho de leitura aleatória e seqüencial de dados binários armazenados em seqüências de caracteres Javascript. Fique ligado. Referências
No comments:
Post a Comment