DNATech :: ⏱️ *TimeCounter Windows vs TimeCounter Linux*

_Créditos da imagem: ChatGPT

### Quando 5 segundos viram 5 milissegundos (só porque você trocou o SO)

Já aviso logo:
**isso não é bug de código. É bug de expectativa.**

Recentemente precisei medir tempo decorrido no Protheus e resolvi fazer o óbvio: usar `TimeCounter()`.
No Windows? Perfeito.
No Linux? Plot twist digno de filme do Nolan.

Vamos aos fatos.

---

## 🧪 O experimento

Mesmo código, mesmo AppServer, apenas mudando o sistema operacional.

### 🪟 Windows

```advpl
nB := TimeCounter()
Sleep(5000)
nE := TimeCounter()
```

Resultado formatado:

```
00h 00m 05s 464ms
```

Agora com `Seconds()`:

```advpl
nB := Seconds()*1000
Sleep(5000)
nE := Seconds()*1000
```

Resultado:

```
00h 00m 05s 481ms
```

✔️ Diferença pequena, aceitável, vida real acontecendo.
Tudo dentro do esperado.

---

### 🐧 Linux (agora segura)

Mesmo teste com `TimeCounter()`:

```advpl
nB := TimeCounter()
Sleep(5000)
nE := TimeCounter()
```

Resultado:

```
00h 00m 00s 5ms
```

Sim. **Cinco milissegundos.**
O servidor acabou de viajar no tempo.

---

## 🤨 Mas… por quê?

Aqui está o pulo do gato:

* **No Windows**, `TimeCounter()` retorna **milissegundos**
* **No Linux**, `TimeCounter()` retorna **segundos (double)**

Ou seja:
o *nome da função é o mesmo*,
mas o *contrato muda conforme o SO*.

Isso explica tudo.

Quando você faz:

```advpl
TimeCounter() - nB
```

No Linux, o valor retornado é algo como:

```
5.007055  // segundos
```

E quando você manda isso para um formatter que **acha que é milissegundo**…
boom 💥 → `5ms`.

Matematicamente certo. Semanticamente errado.

---

## 🔍 Ajustando o foco

Quando multiplicamos explicitamente:

```advpl
(TimeCounter() * 1000)
```

O resultado no Linux volta ao normal:

```
~5000ms
```

Ou seja:

> **No Linux, `TimeCounter()` não é um counter de milissegundos.
> É um relógio em segundos disfarçado.**

---

## 🧠 Conclusão (na lata)

* `TimeCounter()` **não é cross-platform**
* O comportamento **muda entre Windows e Linux**
* Usar a função sem normalizar é pedir bug silencioso

Se você mede:

* performance
* timeout
* elapsed time
* SLA
* profiling

👉 **não confie cegamente em `TimeCounter()`**

---

## ✅ O caminho seguro

Opção 1 — simples e honesta:

```advpl
Seconds() * 1000
```

Opção 2 — wrapper defensivo:

```advpl
Static Function GetMilliSeconds()
Local n := TimeCounter()
If n < 100000000
   n *= 1000
EndIf
Return n
```

Código antigo, problema moderno, solução clássica.

---

## 🧓⚙️ Moral da história

> No Protheus, o tempo é relativo.
> Principalmente se você roda em Linux
> e acredita demais na documentação.

Desconfie. Meça. Compare.
O relógio não mente — **a API às vezes mente por ele.**

---

#Protheus, #ADVPL, #TimeCounter, #Seconds, #AppServer, #LinuxVsWindows, #CrossPlatform, #BugSilencioso, #DevRaiz, #LegacyCode, #TechDebt, #DebugLife, #ERP, #TOTVS, #ProgramadorSênior

Torne-se um Sponsor: 🥊(дави)={0.5x[(Налдо)+(Алине)]}🥊

Comentários

Postagens mais visitadas