Минимальное обращение к ключу это действительно 18-20 мс. Существуют определенные ограничения при обмене между ключом и компьютером, обусловленные скоростью ARM-процессора ключа, скоростью компьютера, спецификацией USB, задержками в стеке USB-драйверов, протоколом общения с ключом, шифрованием этого протокола и защитой клиентской части псевдокодом Guardant. Это все снижает скорость обмена, но повышает защищенность и сложность перехвата и анализа трафика с ключом.
В частности, USB-спецификация ограничивает частоту опроса ключа значением 1000 раз в секунду. Т.е. мы можем отправлять запрос в ключ не чаще одного раза в 1 мс. Даже пустой вызов GrdCodeRun с точки зрения протокола обмена это сложная операция, состоящая из серии запросов и ответов к ключу. Если снять с этой функции шифрование протокола и псевдокод то можно добиться понижения задержки с 20 мс до 15 мс, но ценой этого будет существенное падение защищенности.
Заметно улучшить это время практически невозможно в силу аппаратных ограничений, но самое главное - это не особо нужно. Ключ защиты это специфическое устройство, при использовании которого нужно учитывать его особенности. Если ваша задача - защита ПО от пиратства, или к примеру фискальная регистрация, то ограничение в 20 мс не должно стать помехой. У нас есть хороший клиент, который пытался привязать выполнение алгоритма ключа Code к частоте обновления монитора на медицинском оборудовании, и даже при таких вводных ему удалось спроектировать и создать отличную систему защиты.
Нужно искать баланс между размещением кода в ключ и зависимостью от него и качеством системы защиты. Собственно в этом есть некоторое искусство :)