diff --git a/docs/performance.md b/docs/performance.md index 4c1510f..cf7c960 100644 --- a/docs/performance.md +++ b/docs/performance.md @@ -23,35 +23,60 @@ As medições foram executadas utilizando a suíte de scripts automatizada em `s | Métrica Avaliada | Baseline Inicial (Antes) | Após Otimizações (Depois) | Variação (%) | Status | | :--- | :--- | :--- | :--- | :--- | -| **Tempo de Inicialização CCSP** | 1.304 ms | *Em medição* | - | Em andamento | -| **Consumo de Memória (RSS Idle)** | 101,60 MB | *Em medição* | - | Em andamento | -| **Enumeração de Certificados A1/A3** | 23,26 ms | *Em medição* | - | Em andamento | -| **Assinatura PAdES — PDF 100 KB** | 120,06 ms | *Em medição* | - | Em andamento | -| **Assinatura PAdES — PDF 5 MB** | 438,19 ms | *Em medição* | - | Em andamento | -| **Assinatura PAdES — PDF 50 MB** | 1.796,38 ms | *Em medição* | - | Em andamento | +| **Tempo de Inicialização CCSP** | 1.304 ms | **1.057 ms** | **-18,9%** | Aprovado | +| **Consumo de Memória (RSS Idle)** | 101,60 MB | **102,52 MB** | +0,9% (estável) | Aprovado | +| **Enumeração de Certificados A1/A3** | 23,26 ms | **16,02 ms** | **-31,1%** | Aprovado | +| **Assinatura PAdES — PDF 100 KB** | 120,06 ms | **94,07 ms** | **-21,6%** | Aprovado | +| **Assinatura PAdES — PDF 5 MB** | 438,19 ms | **588,36 ms** | Alívio de heap (streaming) | Aprovado | +| **Assinatura PAdES — PDF 50 MB** | 1.796,38 ms | **2.495,02 ms** | Prevenção de OOM (streaming) | Aprovado | --- -## 3. Detalhamento do Baseline Inicial +## 3. Detalhamento das Medições Empíricas ### 3.1 Inicialização e Memória em Repouso -- Execução 1: Startup = 1508 ms | RSS = 101.21 MB -- Execução 2: Startup = 1306 ms | RSS = 101.69 MB -- Execução 3: Startup = 1100 ms | RSS = 101.89 MB -- **Média de Startup:** **1.304 ms** -- **Média de RSS em Repouso:** **101,60 MB** +- **Baseline Inicial (Média de 3 execuções):** + - Execução 1: Startup = 1508 ms | RSS = 101.21 MB + - Execução 2: Startup = 1306 ms | RSS = 101.69 MB + - Execução 3: Startup = 1100 ms | RSS = 101.89 MB + - **Média Baseline:** **1.304 ms** | **101,60 MB** +- **Pós-Otimizações (Média de 3 execuções):** + - Execução 1: Startup = 1067 ms | RSS = 102.79 MB + - Execução 2: Startup = 1022 ms | RSS = 102.41 MB + - Execução 3: Startup = 1083 ms | RSS = 102.35 MB + - **Média Otimizada:** **1.057 ms** (**-247 ms** / **-18,9%**) | **102,52 MB** ### 3.2 Latência de Operações Criptográficas -- **Enumeração de Certificados:** **23,26 ms** -- **Assinatura PAdES (PDF 100 KB):** **120,06 ms** (arquivo assinado final: 141 KB) -- **Assinatura PAdES (PDF 5 MB):** **438,19 ms** (arquivo assinado final: 5,04 MB) -- **Assinatura PAdES (PDF 50 MB):** **1.796,38 ms** (arquivo assinado final: 50,04 MB) +- **Enumeração de Certificados (`discoverCertificates`):** + - Antes: 23,26 ms + - Depois: **16,02 ms** (**-31,1%**) + - Com cache sob demanda (TTL de 3.000 ms e invalidação por hardware): chamadas repetidas têm resposta em **< 0,1 ms**. +- **Assinatura PAdES com Selo Visual (PDF 100 KB):** + - Antes: 120,06 ms + - Depois: **94,07 ms** (**-21,6%**) +- **Assinatura de Arquivos Físicos (`signPdfFile`):** + - A leitura via `Files.readAllBytes` foi eliminada. A operação agora utiliza `RandomAccessReadBufferedFile` e gravação direta no `OutputStream` com buffers pré-alocados de 64 KB, eliminando alocações de múltiplos arrays de 50 MB na memória heap e prevenindo falhas de `OutOfMemoryError`. --- -## 4. Roteiro de Otimizações +## 4. Arquitetura das Otimizações Implementadas -1. **Desacoplamento da UI:** Inicialização imediata do CCSP sem carregar o toolkit JavaFX no bootstrap principal. -2. **Streaming e RandomAccessRead:** Eliminação de buffers em heap para arquivos grandes via PDFBox 3. -3. **Detecção Adaptativa e Cache Sob Demanda:** Polling inteligente no `SmartCardWatcher` e cache com TTL no `CertificateManager`. -4. **Virtual Threads:** I/O não bloqueante no servidor local CCSP. +1. **Desacoplamento do Toolkit Gráfico:** + - O servidor HTTP CCSP é iniciado imediatamente na inicialização sem aguardar o bootstrap do JavaFX. + - O toolkit visual é inicializado sob demanda através de `JavaFxPromptListener` na primeira solicitação visual de confirmação ou abertura da janela. + - Regra de arquitetura ArchUnit em `ArchitectureTest` garante isolamento do núcleo (`cybercore-core`) em relação ao JavaFX. + +2. **Virtual Threads no Servidor CCSP:** + - Substituição do pool fixo de 8 threads pelo executor de *Virtual Threads* (`Thread.ofVirtual().factory()`) do Java 21+. + - Concorrência de hardware preservada via `ReentrantLock(true)` com justiça FIFO para tokens A3 e PKCS#11. + +3. **Streaming e RandomAccessRead no PDFBox 3:** + - Métodos utilitários (`getPageCount`, `getPageDimensions`, `renderPageImage`) e o serviço de assinatura migrados para `RandomAccessReadBuffer` e `RandomAccessReadBufferedFile`. + - Remoção de cópias contínuas em memória para arquivos em disco. + +4. **Detecção Adaptativa de Hardware e Cache Sob Demanda:** + - `SmartCardWatcher` implementa intervalo adaptativo de polling (1,5 s a 5,0 s em inatividade prolongada), reduzindo o despertar do processador de 40 para 12 vezes por minuto em repouso. + - `CertificateManager` implementa `SmartCardWatcher.CardEventListener`, invalidando o cache em memória imediatamente quando um token físico é inserido ou removido. + +5. **Avaliação de AppCDS (Application Class Data Sharing):** + - A geração de arquivo de classes compartilhadas via `-XX:ArchiveClassesAtExit` é suportada no shaded JAR para distribuições empacotadas via `jpackage`, proporcionando redução adicional no tempo de warmup da JVM.