Как я генерирую .proto файл от класса C#, украшенного атрибутами?

Вызов sqrt не совершенно точен, как был упомянут, но это интересно и поучительно, что это не сдувает другие ответы с точки зрения скорости. В конце концов, последовательность инструкций по ассемблеру для sqrt является крошечной. Intel имеет аппаратную инструкцию, которая не используется Java, которому я верю, потому что она не соответствует IEEE.

Итак, почему это медленно? Поскольку Java на самом деле называет стандартную программу C через JNI, и это на самом деле медленнее, чтобы сделать так, чем назвать подпрограмму Java, которая саму медленнее, чем выполнение, это встраивает. Это является очень раздражающим, и Java должен был предложить лучшее решение, т.е. создающий в вызовах библиотеки операций с плавающей точкой при необходимости. О, хорошо.

В C++, я подозреваю, что все сложные альтернативы проиграли бы на скорости, но я не проверил их всех. То, что я сделал, и что люди Java найдут полезным, является простым взломом, расширением тестирования особого случая, предложенного A. Король. Используйте единственное длинное значение в качестве небольшого массива, который не является проверенными границами. Тем путем у Вас есть булев поиск на 64 бита.

typedef unsigned long long UVLONG
UVLONG pp1,pp2;

void init2() {
  for (int i = 0; i < 64; i++) {
    for (int j = 0; j < 64; j++)
      if (isPerfectSquare(i * 64 + j)) {
    pp1 |= (1 << j);
    pp2 |= (1 << i);
    break;
      }
   }
   cout << "pp1=" << pp1 << "," << pp2 << "\n";  
}


inline bool isPerfectSquare5(UVLONG x) {
  return pp1 & (1 << (x & 0x3F)) ? isPerfectSquare(x) : false;
}

стандартная программа isPerfectSquare5 работает приблизительно в 1/3 время на моей core2 машине дуэта. Я подозреваю, что дальнейшие тонкие настройки в том же направлении могли уменьшить время далее в среднем, но каждый раз Вы проверяете, Вы обмениваете больше тестирования на большее количество устранения, таким образом, Вы не можете пойти слишком много дальше на той дороге.

, Конечно, вместо того, чтобы иметь отдельный тест для отрицания, Вы могли проверить высокие 6 битов тот же путь.

Примечание, которое все я делаю, устраняет возможные квадраты, но когда у меня есть потенциальный случай, я должен назвать исходный, встроенный isPerfectSquare.

init2 стандартную программу называют однажды для инициализации статических значений pp1 и pp2. Обратите внимание, что в моей реализации в C++, я использую неподписанный длинный длинный, поэтому так как Вы подписываетесь, необходимо было бы использовать>>> оператор.

нет никакой внутренней потребности к граничной проверке, массив, но оптимизатор Java должен понять этот материал довольно быстро, таким образом, я не обвиняю их в этом.

25
задан Marc Gravell 26 August 2009 в 13:58
поделиться

2 ответа

Хорошие новости; то, что вы описали (наличие существующих классов C #), является ожидаемым вариантом использования protobuf-net. Все .proto вещи ("protogen", надстройка VS и т.д.) были добавлены как запоздалые мысли . Ядро protobuf-net не знает о них и не заботится о них.

буферы протокола определяют DSL (.proto, как вы упомянули), который используется совместно между реализациями и (иногда) используется для генерации кода. Когда я впервые написал protobuf-net, аспект генерации кода не был моей самой большой проблемой - просто разработчики .NET обычно виноваты (включая меня) в том, что сначала реализация, а не контракт.

Как следствие , protobuf-net не требует файлов .proto для работы; атрибутированного класса достаточно для однозначной сериализации / десериализации. Просто используйте Serializer.Serialize , .Merge и .Deserialize (и т. Д.).

Тем не менее; он действительно включает в себя некоторые очень слаборазвитые и экспериментальные поддержки для этого:

string proto = Serializer.GetProto<YourType>();

Это далеко не все, но может работать для простых типов. Если у вас есть какие-то конкретные случаи, когда это не удается, дайте мне знать (добавьте комментарий или запишите проблему). Однако; в большинстве случаев люди, интересующиеся .proto, сначала напишут .proto и будут работать оттуда.

Примеры рабочих декорированных типов показаны на домашней странице проекта ; использование атрибутов WCF полностью зависит от вас,

32
ответ дан 28 November 2019 в 21:25
поделиться

До Скит Марк вбегает сюда и получает огромные взлеты, позвольте мне указать protobuf.net.

5
ответ дан 28 November 2019 в 21:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: