A tarefa é encontrar uma maneira de desenhar uma linha horizontal em uma matriz de números inteiros de 16 bits.
Estamos assumindo uma matriz de 256x192 pixels com 16 pixels por palavra. Uma linha é uma execução contígua de bits do conjunto (1). As linhas podem começar no meio de qualquer palavra, se sobrepor a outras palavras e terminar em qualquer palavra; eles também podem começar e terminar na mesma palavra. Eles podem não passar para a próxima linha. Dica: as palavras do meio são fáceis - basta escrever 0xffff, mas as bordas serão complicadas, assim como o caso e o início e o fim da mesma palavra. Uma função / procedimento / rotina deve ter uma coordenada x0 e x1 indicando os pontos de partida e parada horizontais, bem como uma coordenada y.
Eu me excluo disso porque eu mesmo projetei um algoritmo quase idêntico para um processador incorporado, mas estou curioso para saber como os outros lidariam com isso. Pontos de bônus por usar operações relativamente rápidas (por exemplo, uma operação de multiplicação ou ponto flutuante de 64 bits não seria rápida em uma máquina incorporada, mas uma simples troca de bits seria).
fonte
Respostas:
Esse código pressupõe que x0 e x1 são pontos de extremidade inclusivos e que as palavras são pouco endian (ou seja, o pixel (0,0) pode ser definido com
array[0][0]|=1
).fonte
Pitão
O principal truque aqui é usar uma tabela de pesquisa para armazenar máscaras de bits dos pixels. Isso economiza algumas operações. Uma tabela de 1kB não é tão grande, mesmo para uma plataforma incorporada atualmente
Se o espaço for realmente pequeno, pelo preço de alguns & 0xf, a tabela de pesquisa pode ser reduzida para apenas 64B
Esse código está em Python, mas seria simples portar para qualquer linguagem que suporte operações de bit.
Se estiver usando C, você poderia considerar desenrolar o loop usando o
switch
do dispositivo de Duff . Como a linha tem no máximo 16 palavras, eu estenderia asswitch
para 14 linhas e dispensaria owhile
conjunto.fonte
Aqui está uma versão C da minha resposta Python usando a instrução switch em vez do loop while e indexação reduzida, incrementando um ponteiro em vez do índice da matriz
O tamanho da tabela de pesquisa pode ser substancialmente reduzido usando T [x1 e 0xf] e U [x2 e 0xf] para obter algumas instruções extras
fonte
Scala,
linhas 7s / 1M linhas4.1s / 1Mprimeira implementação:
Após eliminar a chamada do método interno e substituir o loop for- com um while, no meu 2Ghz Single Core pelo Scala 2.8, ele absolve 1 milhão. Linhas em 4.1s seg. em vez dos 7s iniciais.
Código de teste e chamada:
Teste de performance:
Testado com o tempo da ferramenta unix, comparando o tempo do usuário, incluindo o tempo de inicialização, o código compilado, sem a fase de inicialização da JVM.
Aumentar o número de linhas mostra que, para cada novo milhão, são necessários 3,3s extras.
fonte