рдЧреБрдгрди рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣

рдЧреБрдгрди рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, C ++ рдХрд╛рд░рдХреЛрдВ рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЗрдВрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рдирд╣реАрдВ рд╣реИ, рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреА рдмрд┐рдЯ рдЧрд╣рд░рд╛рдИ рджрд┐рдП рдЧрдП рдХрд╛рд░рдХреЛрдВ рдХреА рдмрд┐рдЯ рдЧрд╣рд░рд╛рдИ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддреА рд╣реИред рд╕рдЯреАрдХрддрд╛ рди рдЦреЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдХрднреА-рдХрднреА рдЧреБрдгрди рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рд╕рдорд╕реНрдпрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╕рд┐рд╕реНрдЯрдо рдЙрд╕ рд╕рдордп рд╕реЗ рд╕рдордп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрдм рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдЯрд┐рдХреНрд╕ рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
unsigned long long getTickCount(); 

рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд▓рдВрдмрд╛ рд▓рдВрдмрд╛ 64 рдмрд┐рдЯреНрд╕ рд╣реИред рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рднреМрддрд┐рдХ рд╕рдордп рдЗрдХрд╛рдЗрдпреЛрдВ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рд╣реИ:
 const unsigned long long TICKS_PER_SECOND = 1999000001ULL; 

рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд╕рд╛рде рдиреИрдиреЛрд╕реЗрдХрдВрдб getNsec (рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд▓рдВрдмреА рд▓рдВрдмреА рдЯрд┐рдХ) рдореЗрдВ рдЯрд┐рдХреНрд╕ рдХреЗ рдЕрдиреБрд╡рд╛рдж рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:
 unsigned long long getNsecNaive(unsigned long long ticks) { static const unsigned long long NSEC_PER_SECOND = 1000000000ULL; unsigned long long nsec = NSEC_PER_SECOND * ticks / TICKS_PER_SECOND; return nsec; } 

GetNsec () рдлрд╝рдВрдХреНрд╢рди рдпрдерд╛рд╕рдВрднрд╡ рд╕рдЯреАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЯрд┐рдХреНрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдмрдбрд╝рд╛ рдпрд╛ рдЫреЛрдЯрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЫреЛрдЯреЗ рдЯрд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП (рдХрд╣реЗрдВ, 2 ^ 34 рддрдХ), рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд░рдо рдореЗрдВ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
 (NSEC_PER_SECOND * ticks) / TICKS_PER_SECOND 

рдпрд╣реА рд╣реИ, рдкрд╣рд▓реЗ рдЧреБрдгрд╛ рдХрд░реЗрдВ, рдлрд┐рд░ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВред NSEC_PER_SECOND <2 ^ 30 рдХреЗ рдмрд╛рдж рд╕реЗ, рдЧреБрдгрди рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо 2 ^ 64 рд╕реЗ рдХрдо рд╣реЛрдЧрд╛ред
рдмрдбрд╝реЗ рдЯрд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП, рдЪреВрдВрдХрд┐ рдЧреБрдгрди рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдирд┐рдореНрди рдХреНрд░рдо рдореЗрдВ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ:
 NSEC_PER_SECOND * (ticks / TICKS_PER_SECOND) 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рджреВрд╕рд░рд╛ рдХрд╛рд░рдХ рд╣рдореЗрд╢рд╛ рдПрдХ рд╕рдВрдкреВрд░реНрдг рд╣реЛрддрд╛ рд╣реИ, рджрд╢рдорд▓рд╡ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рд╣рдореЗрд╢рд╛ рдиреМ рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдЧрд╛, рдЕрд░реНрдерд╛рдд, рджреВрд╕рд░реА рд╕рдЯреАрдХрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ getNecec () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ getSec () рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рджреВрд╕рд░реА рдУрд░, рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рдЕрдзрд┐рдХ рд╕рдЯреАрдХрддрд╛ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЧреБрдгрди рдФрд░ рд╡рд┐рднрд╛рдЬрди рдХреЗ рдорд╢реАрди рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдЧреИрд░-рд╕рд╛рд╣рдЪрд░реНрдп рдкреНрд░рдХреГрддрд┐ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЧрдгрдирд╛ рдХреЗ 4 рд╕рдВрднрд╛рд╡рд┐рдд рдЖрджреЗрд╢ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН, рджреЛ рдХреЗ рдЕрд▓рд╛рд╡рд╛ 2 рдЕрдзрд┐рдХ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ:
 (NSEC_PER_SECOND / TICKS_PER_SECOND) * ticks 

рдФрд░
 ticks / (TICKS_PER_SECOND / NSEC_PER_SECOND) 

рдкрд╣рд▓рд╛ рд╣рдореЗрд╢рд╛ рд╢реВрдиреНрдп рджреЗрддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ - рдЯрд┐рдХ, рдпрд╛рдиреА рд▓рдЧрднрдЧ 50% рддреНрд░реБрдЯрд┐ (рдЬреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ 0.1% рддрдХ рдХрдо рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рддреНрд░реБрдЯрд┐ рдЕрднреА рднреА рд╕рдмрд╕реЗ рдЫреЛрдЯреА рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ)ред
рддреЛ, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рджреВрд╕рд░реА рд╕рдЯреАрдХрддрд╛ рдорд┐рд▓рддреА рд╣реИред рдмрдврд╝рддреА рд╕рдЯреАрдХрддрд╛ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЛрдВ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдмрдврд╝рддреА рд╡рд░реАрдпрддрд╛ рдХреЗ рдХреНрд░рдо рдореЗрдВ):
  1. рд╡рд╛рд╕реНрддрд╡рд┐рдХ (рдбрдмрд▓) рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЧрдгрдирд╛ рдХрд░реЗрдВ
  2. 128-рдмрд┐рдЯ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рд╡рд┐рддрд░реНрдХ рдХрд░реЗрдВ
  3. рдорд▓реНрдЯреАрдбрд┐рд╡ () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рдпреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо (рдкреНрд░реЛрд╕реЗрд╕рд░) рд╕реАрдорд╛рдУрдВ, рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╡рд╛рддрд╛рд╡рд░рдг рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдорд╛рди рд▓реАрдЬрд┐рдП, TICKS_PER_SECOND рджреНрд╡рд╛рд░рд╛ рдЯрд┐рдХреЛрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдХреЗ, рд╣рдо рд╕реЗрдХрдВрдб рдХреЗ рдЕрдкреВрд░реНрдг рднрд╛рдЧ рдФрд░ рд╢реЗрд╖ r рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:
 unsigned long long seconds = ticks / TICKS_PER_SECOND; unsigned long long r = ticks % TICKS_PER_SECOND; 

рдлрд┐рд░ рдЯрд┐рдХ = рд╕реЗрдХрдВрдб * TICKS_PER_SECOND + rред рд╕реВрддреНрд░ рдореЗрдВ nsec рдХреЗ рд▓рд┐рдП:
nsec = NSEC_PER_SECOND * (рд╕реЗрдХрдВрдб * TICKS_PER_SECOND + r) / TICKS_PER_SECOND = NSEC_PER_SECOND * рд╕реЗрдХрдВрдб + (NSIC_PER_SECOND * r) / TICKS_PER_SECONDред рдЪреВрдВрдХрд┐ r <TICKS_PER_SECOND, (NSEC_PER_SECOND * r) рдХрднреА рднреА рдУрд╡рд░рдлрд╝реНрд▓реЛ рдирд╣реАрдВ рджреЗрдЧрд╛ред рд╕рд╛рд░рд╛рдВрд╢ рд╕рдорд╛рд░реЛрд╣:
 unsigned long long getNsec(unsigned long long ticks) { static const unsigned long long NSEC_PER_SECOND = 1000000000ULL; return NSEC_PER_SECOND * (ticks / TICKS_PER_SECOND) + ((NSEC_PER_SECOND)*(ticks % TICKS_PER_SECOND))/TICKS_PER_SECOND; } 

рдкрд░рд┐рдгрд╛рдо рдареАрдХ рдЙрд╕реА рддрд░рд╣ рд╣реИ рдЬреИрд╕реЗ рд╣рдордиреЗ NSEC_PER_SECOND * рдХреЛ 128-рдмрд┐рдЯ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдЧрд┐рдирд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ TICKS_PER_SECOND рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛, рдЕрд░реНрдерд╛рдд, рджрд┐рдП рдЧрдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо рд╕рдЯреАрдХрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдЗрд╕ рдмрд┐рдЯ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдПред рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рд╕реВрддреНрд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ: рди рддреЛ NSEC_PER_SECOND рдФрд░ рди рд╣реА TICKS_PER_SECOND рдХреЛ рдмреНрд░реИрдХреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдорд▓реНрдЯреАрдбрд┐рд╡ (рдП, рдмреА, рд╕реА) рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ * рдмреА / рд╕реА рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдмреА рдФрд░ рд╕реА рдмрдбрд╝реЗ рд╕реНрдерд┐рд░рд╛рдВрдХ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдЕрдВрд╢ рдмреА / рд╕реА рд░рд┐рдбреНрдпреВрд╕ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред


Source: https://habr.com/ru/post/In123953/


All Articles