Две структуры в TDateTime и быстро

Тема в разделе "WASM.A&O", создана пользователем EvilsInterrupt, 2 ноя 2005.

  1. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Есть структуры:

    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
     
  2. _staier

    _staier New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2003
    Сообщения:
    738
    Адрес:
    Ukraine
    что - то типа

    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);







    учите матчасть
     
  3. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Блин, как будто мне было влоп инклуд врубить и эту ф-цию заюзать! :@



    Я же написал "быстро" а это по возможности чуть ли не машкод!
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    В дельфийской реализации EncodeDate вычисляется не самым быстром способом:

    1) Дважды проверяется високосность - для текущего года и число високосных годов до текущего (для подсчета доп.дней). Чтобы избавиться от двойной проверки можно изменить алгоритм - вместо того чтобы подсчитывать число дней на начало текущего года и затем добавлять дни в соответствии с датой (месяц и день), можно считать число дней до конца года и затем вычитать дни в соответствии с датой

    2) При проверке високосности делается два целочисленных деления на 100 и 400, хотя можно делить только на 100 и затем проверять два младших бита целой части (проверка на високосность) и сдвигать результат на 2 (число високосных годов кратных 400)
     
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Вот слепил на досуге SysTimeToDateTime на асме с учетом вышеизложенных замечаний. Думал в 2-3 раза выигрыш получить, а на деле выходит в 6-7 раз быстрее дельфийской SystemTimeToDateTime (на P4 100-150 тиков против 800-900). Видать в дельфийском варианте еще дурные проверки диапазонов чисел в SYSTEMTIME немало времени поедают



    В аттаче код на фасме с комментами



    [​IMG] _273393033__st2dt.asm
     
  6. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    А тебе обязательно, чтобы исходные данные в структурах лежали? А то если как следует пофтыкать про юлианские дни, можно вообще без вызова SystemTimeToDateTime обойтись, да еще и половину параметров передеть через регистры. Формула расчета JD - не редкость, поисковиком ищется на раз.
     
  7. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    CyberManiac

    > "Формула расчета JD - не редкость"

    Да. Только если эти формулы использовать в лоб, то получится далеко не самый быстрый вариант ;) Какой компилятор сообразит заменить Int(365.25*X) на X*365+(X >> 2) ? А число дней с начала года до начала месяца быстрее взять из таблички 12х2 байт, чем опять вычислять Int(30.6001*M) ;)



    PS: Хотя я честно говоря не очень понимаю для чего тут супербыстродействие. Что за задачка такая, в которой нужно много раз быстро конвертировать время ? На ум приходит только конвертация данных из файлов или БД, но тут само чтение данных тормоза даст нехилые...
     
  8. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    СПасибо, я даже не знаю как выразить благодарность за вашу заботу!

    А задача такова, уже есть и меняться будет не скоро "Прога" чтоб ее! Вот она делает файлы куда ложится DATAB раз в N секунд, которое в ini файле.

    Мне надо разобрать и положить этот файл в оракл, А прог столько что лучше все оптимизированно!