giovedì 15 gennaio 2015

The Long and Short of It

Non solo una volta, ma ripetuto in varie apps lucrativi - un pezzo gigantesco di codice che avrei dovuto essere ridotto ad una mera linea.

Di Mark Bowytz2015/01/14

Datore di lavoro di Thomas B. non è una società che offre una sola applicazione di punta - ha decine !

Per anni, l'azienda ha fatto anno dopo anno attraverso lo sviluppo e il mantenimento di applicazioni di nicchia volte a settori specifici. Fondamentalmente, si trova un'applicazione esistente che manca una caratteristica che potrebbe essere utilizzato solo da una manciata di gruppi in tutto il mondo e poi implementa.

Tuttavia, pur essendo redditizio, è un modello di business un po 'caotico, a volte portando ad alcuni incubi di supporto. Caso in questione: una delle librerie C # applicazioni aziendali elabora le immagini all'interno di un file PDF e li invia tramite una libreria di correzione automatica del colore con forse 25 utenti in tutto il mondo. L'applicazione è stata la vendita di uno o due nuovi utenti ogni anno.

Per molte aziende, questo non sarebbe un gran successo, ma considerando questi utenti erano grandi organizzazioni, tra il prezzo praticato e rinnovo delle licenze annuali di sostegno, è stata una buona, affarista stabile.

Nonostante questi lati positivi, in realtà è stato architettato in forse il modo peggiore possibile. Sepolto nella logica dell'applicazione è stato il codice che generare un thread per ogni immagine (alcuni file PDF possono avere diverse centinaia di immagini!). C'erano deadlock frequenti, più copie degli stessi oggetti in memoria per nessun motivo apparente (immagini e file PDF, in modo molto oggetti di grandi dimensioni), e tre copie del PDF sul disco (che può facilmente essere 300MB a 800MB).

Il motivo dietro la maggior parte di questi problemi? Una funzione che Thomas B. trovato durante una spedizione refactoring:

private static int GetPhysicalFileSize (byte [] Imgbyte, string InputObject, string OutFolder)
{
  int PhysicalFileSize = 0;

  provare
  {
    ExtractImage (Imgbyte, "Photo_" + InputObject + ".jpg", OutFolder);
    var outfile = OutFolder + "\\ Photo_" + InputObject + ".jpg";

    se (File.Exists (OUTFILE))
    {
      FileInfo Fi2 = new FileInfo (OUTFILE);
      PhysicalFileSize = (int) fi2.Length;
    }

    se (File.Exists (OUTFILE))
      File.Delete (OUTFILE);

  catch (Exception ex)

    Trace.WriteError (ex);

  ritorno PhysicalFileSize;


Quindi, per determinare la dimensione di un byte [] come un file, in primo luogo, il codice scriverà le informazioni sul disco, leggere le informazioni e quindi, infine, eliminare il file.

Tutto quel lavoro disco I / O per l'equivalente di questo:

ritorno Imgbyte.Length;
Le chiamate alla più grande funzione, più ingombrante erano disseminate in tutta la fonte, quindi non c'era alcun dubbio la manciata di clienti sarebbe apprezzato della correzione, in quanto i benefici sarebbero immediatamente evidente.

Thomas B. sapeva che fissare questo bug è stata una grande vittoria, ma era solo la punta di un iceberg nel grande catalogo di applicazioni che ha lavorato sul sostegno. Grazie al cielo per clienti fissi.

1 commento:

  1. Casino Slot Machines - Mapyro
    Find Casino 성남 출장샵 Slot Machines - Mapyro 대전광역 출장마사지 - Las Vegas, 성남 출장마사지 NV, US. The casino has a large number of slot 부산광역 출장마사지 machines that you 부천 출장안마 can choose from, including the ones from Microgaming.

    RispondiElimina