
_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
Postar um comentário