Есть структуры: struct t2 { unsigned char mi; unsigned char ho; unsigned char c; unsigned char se; }; struct d2 { short ye; char d; char m; }; struct DA { short code; float value; short status; }; struct DATAB { t2 T2; d2 D2; DA *da; }; DATAB *datab; Есть переменные DATAB Value; TDateTime LastAttach как можно быстро присвоить перменной LastAttach из семи переменных value.DA.d2.ye,value.DA.d2.d,value.DA.d2.m и value.DA.t2.mi,value.DA.t2.hovalue.DA.t2.c,value.DA.t2.se Зы: для builder c++ 6.0
что - то типа Returns a TDateTime that represents a specified year, month, day, hour, minute, second, and millisecond. Unit DateUtils Category datetime routines Delphi syntax: function EncodeDateTime(const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word):TDateTime; C++ syntax: extern PACKAGE System::TDateTime __fastcall EncodeDateTime(const Word AYear, const Word AMonth, const Word ADay, const Word AHour, const Word AMinute, const Word ASecond, const Word AMilliSecond); учите матчасть
Блин, как будто мне было влоп инклуд врубить и эту ф-цию заюзать! :@ Я же написал "быстро" а это по возможности чуть ли не машкод!
В дельфийской реализации EncodeDate вычисляется не самым быстром способом: 1) Дважды проверяется високосность - для текущего года и число високосных годов до текущего (для подсчета доп.дней). Чтобы избавиться от двойной проверки можно изменить алгоритм - вместо того чтобы подсчитывать число дней на начало текущего года и затем добавлять дни в соответствии с датой (месяц и день), можно считать число дней до конца года и затем вычитать дни в соответствии с датой 2) При проверке високосности делается два целочисленных деления на 100 и 400, хотя можно делить только на 100 и затем проверять два младших бита целой части (проверка на високосность) и сдвигать результат на 2 (число високосных годов кратных 400)
Вот слепил на досуге SysTimeToDateTime на асме с учетом вышеизложенных замечаний. Думал в 2-3 раза выигрыш получить, а на деле выходит в 6-7 раз быстрее дельфийской SystemTimeToDateTime (на P4 100-150 тиков против 800-900). Видать в дельфийском варианте еще дурные проверки диапазонов чисел в SYSTEMTIME немало времени поедают В аттаче код на фасме с комментами _273393033__st2dt.asm
А тебе обязательно, чтобы исходные данные в структурах лежали? А то если как следует пофтыкать про юлианские дни, можно вообще без вызова SystemTimeToDateTime обойтись, да еще и половину параметров передеть через регистры. Формула расчета JD - не редкость, поисковиком ищется на раз.
CyberManiac > "Формула расчета JD - не редкость" Да. Только если эти формулы использовать в лоб, то получится далеко не самый быстрый вариант Какой компилятор сообразит заменить Int(365.25*X) на X*365+(X >> 2) ? А число дней с начала года до начала месяца быстрее взять из таблички 12х2 байт, чем опять вычислять Int(30.6001*M) PS: Хотя я честно говоря не очень понимаю для чего тут супербыстродействие. Что за задачка такая, в которой нужно много раз быстро конвертировать время ? На ум приходит только конвертация данных из файлов или БД, но тут само чтение данных тормоза даст нехилые...
СПасибо, я даже не знаю как выразить благодарность за вашу заботу! А задача такова, уже есть и меняться будет не скоро "Прога" чтоб ее! Вот она делает файлы куда ложится DATAB раз в N секунд, которое в ini файле. Мне надо разобрать и положить этот файл в оракл, А прог столько что лучше все оптимизированно!