Най-ефективният начин за xor байтов масив във vb.net

Създавам приложение във vb.net, което ще чете файлове, използвайки масив от байтове като буфер, и ще създава файлове за паритет за тях чрез xoring на данните... Какъв би бил най-ефективният начин за xoring на масив от байтове? Все пак трябваше да конвертирам масива от байтове в битов масив и след това да го стартирам чрез операция xor и да го върна обратно в масив от байтове, но това звучи като много скъпа задача за обработка и се притеснявам, че може да повлияе на скоростта на четене/запис ... има ли по-добър начин да направите това? Благодаря...

За да избегнете объркване: Това, което прави приложението, е да прочете половината файл до местоположение 1, другата половина до местоположение 2, след това паритет (xor на двете части) до местоположение 3...


person Daniel Valland    schedule 15.03.2014    source източник


Отговори (2)


За Xor двубайтови масиви просто използвайте for цикъл и оператора Xor.

Xor на VB.Net ще компилира до CIL Xor код за операция, който впоследствие трябва да бъде компилиран JIT в много бърз x86 Инструкция за процесор XOR.

Цената на операцията Xor вероятно ще бъде незначителна в сравнение с цената на входно-изходния файл.

person Phillip Trelford    schedule 15.03.2014

В зависимост от това какво имате предвид под „ефективен“, мисля, че можете да се справите по-добре от обикновен цикъл. Моят първоначален обаче е да разделя обработката на множество нишки. така че ще завърши по-бързо. Знаете размера на входния масив и следователно на изходния масив, така че би било лесно да разделите натоварването и да оставите всяка нишка да запълни съответната част от резултата.

Има C# статия за кодов проект, която прави подобно. Двоични операции върху байтови масиви с паралелизъм

person Karl Kieninger    schedule 15.03.2014
comment
Това, което имам предвид под ефективна, е цената на обработката, която се превежда като скорост на четене/запис. Тъй като този процес включва четене и писане на файлове, бих искал решение, което не ограничава скоростта на четене/запис на твърдия диск, като е твърде скъпо за процесора. Да предположим, че използвам цикъл, който xor всеки байт. Тогава процесорът ще има максимална обработка от X байта /s. Твърдият диск също има скорост на запис/четене от X байта/s. ако процесорът има по-нисък капацитет от X байта/s от твърдите дискове за четене/запис, резултатът ще бъде по-ниска скорост на четене/запис. Тогава ефективен означава кодът, който може да xor най-много байтове /s... - person Daniel Valland; 16.03.2014
comment
Друг проблем е, ако имам файл с размер, който не може да се дели на две, какво да правя с последния байт по отношение на разделянето на файла на две... - person Daniel Valland; 16.03.2014
comment
Съгласен съм с @Phillip Trelford, че цената на процесора почти сигурно ще бъде незначителна в сравнение с цената на I/O на файлове. Начинът, по който решавате да се справите с нечетния байт, по същество е без значение за ефективността. Вероятно бих запълнил късата половина с 0 байта при зареждане и бих го нарекъл добър. - person Karl Kieninger; 16.03.2014