Snabba upp eller sakta ner tid i javascript?

Permalänk
Medlem

Snabba upp eller sakta ner tid i javascript?

Hej,

jag försöker att snabba upp/sakta ner tid i javascript med en faktor X.

Ex. Faktor på 200 skulle ge 24h på 7.2 minuter.

Hur kan jag på ett enkelt sätt göra detta i javascript?

Permalänk
Hedersmedlem
Skrivet av waimea:

Hej,

jag försöker att snabba upp/sakta ner tid i javascript med en faktor X.

Ex. Faktor på 200 skulle ge 24h på 7.2 minuter.

Hur kan jag på ett enkelt sätt göra detta i javascript?

Såvitt fysiken känner till så är enda sätten att snabba upp och sakta in tid starka gravitationsfält eller höga hastigheter. Mer kan du läsa i artikeln om tidsdilation på Wikipedia.

Hur vill du göra? Har du tänkt bygga en farkost som accellererar till nära ljusets hastighet, eller tänkte du fixa typ ett svart hål eller något? Det påverkar lösningsmetoden.

Permalänk
Medlem

@pv2b: Hej, tack för ditt snabba svar.

Tidsdilation är ett nytt koncept för mig men intressant läsning!

Jag håller på att göra en node backend och vill testa 24h "körande" av backenden.

Men jag vill inte vänta 24h utan jag vill titta på loggarna för 7.2 minuter eller X minuter.

Om möjligt så skulle jag också vilja ha möjligheten att gå från snabb till normal hastighet eller från normal hastighet till långsam hastighet.

T.ex. att klockan 08:00 så kommer en POST request, klockan går från snabb till normal hastighet.

Sedan mellan 08:30 och 10:30 så händer ingenting och då går klockan snabbare igen. Klockan 10:45 kommer två POST requests och klockan går från snabb till normal till långsam.

Jag hoppas att jag är tydlig med vad jag försöker göra?

Permalänk
Hedersmedlem

Om du inte tänkte skjuta upp servern i rymden i löjlig hastighet, så är kanske den enklaste lösningen att ändra klockan i servern? Ha något script som regelbundet ställer fram klockan?

Alternativt se om det på något sätt går att overrida klasserna som används för att ta fram systemtiden till att returnera något slags fejkade värden? Det är om något ett ännu större ingrepp.

Men min fråga är i så fall, varför vill du göra det här? Det låter som att du har något slags problem du försöker lösa, och du tänker dig att "snabba upp tiden" är din lösning, men jag tror du får ett bättre svar om du backar tillbaka bandet och förklarar vad det är du vill åstadkomma.

Permalänk
Medlem

@pv2b: Hej,

jag har provat ett bibliotek för att snabba upp systemtiden (utan framgång).

Som jag skrev ovan, jag håller på att utveckla en backend i node och jag vill simulera 24h körande på 7.2 min.

Jag vill alltså kunna snabba upp/sakta ner tiden. Jag har ett script som ger mig aktuell tid i formatet HH:MM:SS.

Jag vill kunna ändra faktorn som snabbar upp/saktar ner tiden så att klockan går 2x, 4x, 8x etc snabbbare/långsammare.

function startTime() {
var today = new Date();
var h = today.getHours();
var m = today.getMinutes();
var s = today.getSeconds();
h = checkTime(h);
m = checkTime(m);
s = checkTime(s);

document.getElementById('clock').innerHTML =
h + ":" + m + ":" + s;

var t = setTimeout(startTime, 500);
}
function checkTime(i) {
if (i < 10) { i = "0" + i };
return i;
}

Detta script körs med en <body onload="startTime()">

Permalänk
Hedersmedlem

Alltså, nu blir jag förvirrad, för du skriver samtidigt att du vill göra detta i Node på en server, och samtidigt att du kör ditt script i <body onload> vilket innebär att den körs i webbläsaren och inte i Node?

Du har inte heller egentligen förklarat varför du vill simulera att tiden går snabbare.

Permalänk
Medlem

@pv2b: Helt rätt, jag kör detta script i frontend, från min backend så får jag en dataström.

Jag vill testa ett dygns körning av min backend på 7,2 minuter, testet körs i frontend och jag har inte kommit till att eventuellt öka/minska faktorn i node. Jag vill inte sitta och titta på loggar i 24h utan jag vill snabbspola framåt.

Har du några konkreta förslag på hur jag ska göra för att få 24h att ske på 7.2 minuter i min klocka?

Permalänk
Hedersmedlem

Alltså, det finns inget generellt sätt att simulera att din backend kör i 24 timmar.

Det du kan göra är att joxa med systemklockan, som sagt, så att klockan på din node-server går 200 gånger snabbare. Men det blir ju inte ett rättvisande test egentligen av alla aspekter av din kod. Om du bara joxar med klockan så kommer ändå själva datorn du kör testet på inte vara 200 gånger snabbare, och du kommer inte heller att få in 200 gånger så många anrop utifrån.

Utan att veta vad det är du vill åstadkomma så kan jag inte komma med något annat sätt än att svara på att exakt det du vill göra typ inte går, borträknat att skjuta ut servern i rymden då alltså.

Beroende på vad du kan göra så kanske du kan göra något som:

- Konfigurera om din kod så att den gör saker 200 gånger oftare än vanligt.
- Fixa en stor mängd anrop utifrån (förutsatt att din hårdvara klarar av det) så att du får ett dygns belastning på 7,2 minuter.
- Centralisera alla dina anrop i dina program som tar fram tiden i en funktion som du sedan modifierar att skicka tillbaka fejkade tidsstämplar.

En sista variant är att faktiskt köra ditt test i 24 timmar och logga till en loggfil som du läser i efterhand, det finns inget som säger att du ska sitta och läsa dina loggar i realtid allt eftersom de spottas ut.

Permalänk
Medlem

Jag hade gjort som @pv2b säger alternativt ersatt startTime() med en egen funktion som returnerar klockslag som är av intresse.

Edit: en ninja-edit från pv2b gjorde mitt förslag överflödigt

Visa signatur

WS: MSI B350M Mortar | AMD Ryzen 7 1700 | PH-TC14PE | 32GB DDR4 3000MHz | 1TB Kingston NV2 | Intel Arc A750 8GB | 2*BenQ G2420HDB
Router: Gigabyte GA-870-UD3 | AMD Phenom II x6 1055t @ 2600MHz, 1.25V | 12GB DDR3 | 2*250GB HDD @ RAID1 | 4TB HDD
Laptop: Thinkpad X220 4291-QF6

Permalänk
Medlem

Hej,

tack för era svar!

Om jag backar lite och bara vill göra så att min klocka går 2x fortare/saktare, är detta möjligt?

Permalänk
Hedersmedlem

@waimea: Det är exakt samma problematik oavsett om du vill att din klocka går 2 ggr snabbare, 200 ggr snabbare, eller 2% snabbare.

Du har fortfarande inte förklarat varför du vill att tiden ska gå snabbare. Om du förklarar vad det är du vill åstadkomma, d.v.s. *varför* du vill att tiden ska gå snabbare, så lovar jag att du kommer få bättre svar.

Permalänk
Medlem

@pv2b: Jag har redan förklarat varför jag vill att klockan ska gå fortare, jag vill köra ett test av min backend på 24h uppsnabbat till 7.2 minuter eller liknande tidsintervall.

Om detta inte är möjligt pga. anledningar i ditt tidigare svar så vill jag kunna ändra hastigheten på tid, så att klockan fysiskt visar tiden uppsnabbat eller nedsaktat X gånger.

Permalänk
Keeper of Traditions

Osäker på vad du menar med ett "test av min backend", men istället för att försöka snabba upp eller sakta ner systemklockan kan du väl bara simulera en mängd händelser som skulle kunna ske på servern, så kallad unit testing?

Om det är "riktig" trafik till servern du vill testa så vet jag inte hur du ska kunna snabba upp/sakta ner det.

Visa signatur

|| Intel 8700K || Asus RTX 4070 TI Super TUF || Samsung 750 EVO 500GB & Kingston A2000 1TB & Samsung 960 EVO 250GB || Corsair RM 850x || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Permalänk
Medlem

Nu har jag ingen koll på Javascript och förstår inte exakt hur du vill att detta ska fungera, men du kan inte implementera din egen klocka som ökar tiden med passerad tid från systemklockan multiplicerad med din faktor? Krävs lite arbete men om du absolut vill att det ska fungera på ett sätt som inte går med existerande kod får du skapa din egen kod som gör det.

Permalänk
Hedersmedlem

Skulle det funka att bara köra din backend i 7,2 minuter, logga allt till en fil, och sedan gå igenom loggfilerna och ändra tidsstämplarna på loggen så att det ser ut som att det gått 24 timmar?

Om du på något sätt skulle få systemklockan att gå 200 ggr snabbare skulle du ju få exakt samma resultat i slutändan.

Permalänk
Medlem

Detta är ju ett vanligt förekommande problem inom testning. Jag tycker du redan fått den bästa lösningen, att simulera klockan. Det är så man "brukar" göra.

Exempelvis i en klass. Du implementerar en standardimplementation som går direkt mot klockan. Sedan implementerar du en specialiserad variant som returnerar en simulerad klocka istället som du kan snabba upp eller sakta ned vid behov. Gör det lätt att byta mellan. Jättesmidigt!

Permalänk
Hedersmedlem
Skrivet av waimea:

@pv2b: Jag har redan förklarat varför jag vill att klockan ska gå fortare, jag vill köra ett test av min backend på 24h uppsnabbat till 7.2 minuter eller liknande tidsintervall.

Om detta inte är möjligt pga. anledningar i ditt tidigare svar så vill jag kunna ändra hastigheten på tid, så att klockan fysiskt visar tiden uppsnabbat eller nedsaktat X gånger.

Men du förklarar inte varför. Händer det något speciellt under 24h som du sett eller är det bara en tid som du vill se att det fungerar? Att "snabba upp klockan" är inte hur man brukar testa saker. Antingen testar man klockslag eller så testar man last genom att göra en viss mängd anrop med en viss mängd data eller så kan man köra ett långt test under lång tid.

Permalänk
Medlem
Skrivet av Curik:

Detta är ju ett vanligt förekommande problem inom testning. Jag tycker du redan fått den bästa lösningen, att simulera klockan. Det är så man "brukar" göra.

Exempelvis i en klass. Du implementerar en standardimplementation som går direkt mot klockan. Sedan implementerar du en specialiserad variant som returnerar en simulerad klocka istället som du kan snabba upp eller sakta ned vid behov. Gör det lätt att byta mellan. Jättesmidigt!

Skrivet av Shimonu:

Men du förklarar inte varför. Händer det något speciellt under 24h som du sett eller är det bara en tid som du vill se att det fungerar? Att "snabba upp klockan" är inte hur man brukar testa saker. Antingen testar man klockslag eller så testar man last genom att göra en viss mängd anrop med en viss mängd data eller så kan man köra ett långt test under lång tid.

Hej, tack för era svar.

Jag skickar post requests med axios och ibland så får jag 500 status kod utan att jag förstår varför detta sker. Jag vill köra en dag och se om det är ett återkommande fel eller något slumpmässigt.

1. Hur testar jag klockslag?
2. Hur testar jag last?

Permalänk
Medlem
Skrivet av waimea:

Hej, tack för era svar.

Jag skickar post requests med axios och ibland så får jag 500 status kod utan att jag förstår varför detta sker. Jag vill köra en dag och se om det är ett återkommande fel eller något slumpmässigt.

1. Hur testar jag klockslag?
2. Hur testar jag last?

Du har ju fått förklaringen flera gånger nu.. Här är första resultatet på Google:
https://stackoverflow.com/questions/7931069/how-to-fake-time-...

Permalänk
Hedersmedlem
Skrivet av waimea:

Jag skickar post requests med axios och ibland så får jag 500 status kod utan att jag förstår varför detta sker. Jag vill köra en dag och se om det är ett återkommande fel eller något slumpmässigt.

Du menar alltså att du skickar detta post request och sedan någon stund senare skickar du exakt samma request och det blir rätt?

Det låter som att det du egentligen vill göra är att slå på något slags debug-loggning i det ramverk du använder för att försöka reda ut exakt varför du får de felmeddelanden du får.

Vad säger server-loggen vid de tidpunkter du får 500 tillbaka?

Permalänk
Hedersmedlem
Skrivet av waimea:

Hej, tack för era svar.

Jag skickar post requests med axios och ibland så får jag 500 status kod utan att jag förstår varför detta sker. Jag vill köra en dag och se om det är ett återkommande fel eller något slumpmässigt.

1. Hur testar jag klockslag?
2. Hur testar jag last?

Bra! Det var det här alla var ute efter att förstå. Du vill snarare ha hjälp med att debugga än hur du "snabbar upp tiden".

Permalänk
Medlem

Hej,

jag ska köra några timmar och se om jag hittar några återkommande fel.

Jag är fortfarande intresserad av koden jag klistrade in ovanför,

går det göra om den koden så att den: (antingen eller)

1. Visar tiden
2. Visar en timer som räknar ner från X minuter

Alla förslag tas tacksamt emot!

Permalänk
Medlem

Inga förslag på hur jag kan kombinera en klocka med en timer?

Permalänk
Medlem
Skrivet av waimea:

Inga förslag på hur jag kan kombinera en klocka med en timer?

Har du ingen loggning på servern som kan ge dig information om vad ditt slumpmässiga 500 innebär? Eller har du ingen access till servern? Alla exceptions bör ju loggas och där har du tillgång till klockslag, typ av request och själva exceptionet.

Permalänk
Medlem

Du kan använda dig av sinon.useFakeTimers()

500 fel är internal server error. Säker på att du hanterar alla fel-events korrekt från t.ex. dataströmmen?

Borde stå något vettigare i nodejs loggen.

och för din egen skull, sådant här ska du testa med unit-tester och inte manuellt.

Permalänk
Medlem
Skrivet av waimea:

Inga förslag på hur jag kan kombinera en klocka med en timer?

Du frågar lite efter hur man kokar ett ägg. Googla så kommer du få en miljon kodexempel