BUG: funzioni di stringa _MBCS del file Msvcrt.dll (versione 6.1.8637.0) È lente rispetto a versioni precedenti

Traduzione articoli Traduzione articoli
Identificativo articolo: 264795 - Visualizza i prodotti a cui si riferisce l?articolo.
Questo articolo è stato archiviato. L?articolo, quindi, viene offerto ?così come è? e non verrà più aggiornato.
Espandi tutto | Chiudi tutto

In questa pagina

Sintomi

Multibyte character set (MBCS) stringa funzioni forniti dal file Msvcrt.dll (versione 6.1.8637.0) rilasciato con Microsoft Windows 2000 e Microsoft Windows ME, ad esempio _ismbcspace un rallentamento delle prestazioni rispetto a versioni precedenti del file Msvcrt.dll si rilasciato con Microsoft Windows NT 4.0, Windows 9 x o Visual c ++ 6.0. Il rallentamento delle prestazioni interessa tutte le applicazioni in cui, direttamente o indirettamente, vengono utilizzate le funzioni di stringa MBCS del file Msvcrt.dll.

Il file Mfc42.dll è creato con una direttiva di processore _MBCS per impostazione predefinita e le funzioni di CString di MFC (Microsoft Foundation Class Library) utilizzano le funzioni MBCS del file Msvcrt.dll per impostazione predefinita. Le applicazioni che utilizzano le funzioni di CString MFC hanno un rallentamento delle prestazioni durante l'esecuzione in Windows 2000 e Windows ME rispetto a quando vengono eseguiti in Windows 9 x e Windows NT 4.0.

Il livello di riduzione delle prestazioni dipende dal modo intensivo l'applicazione utilizza funzioni di stringa MBCS fase di esecuzione o le funzioni di CString MFC.

Risoluzione

Per risolvere questo problema è necessario ottenere la versione più recente del service pack per Windows 2000. Per ulteriori informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
260910Come ottenere Windows 2000 Service Pack più recente
Seguono tre possibili soluzioni del problema:
  1. Ricreare l'applicazione in modo che si colleghi staticamente alla libreria run-time. La libreria statica non presenta prestazioni ritardate con le funzioni di stringa MBCS in Windows 2000 e Windows ME.
  2. Modificare l'applicazione rendendola compatibile con Unicode in Windows 2000. Ad esempio, che si trova utilizzare _ttoi(argv[1]) nel codice di esempio nella sezione "Informazioni" di questo articolo invece di atoi(argv[1]) . Rigenerare l'applicazione con il manifesto _UNICODE anziché _MBCS . Se nell'applicazione si utilizza MFC, la versione Unicode della libreria MFC viene utilizzata in base all'impostazione predefinita. Per ulteriori informazioni sulla programmazione Unicode fare riferimento alla libreria MSDN.
  3. Se l'applicazione utilizza solo set di caratteri a byte singolo (SBCS), ricreare l'applicazione senza il manifesto _MBCS . Se l'applicazione utilizza le funzioni di CString MFC, si ancora verificherà il problema MBCS perché MFC è progettato con _MBCS per impostazione predefinita. Seguono due possibili soluzioni del problema:
    • Aggiungere \MFC\SRC\Strex.cpp al progetto e compilarlo senza _MBCS . Il file Strex.cpp implementa le funzioni di CString . Questo potrebbe non funzionare se l'applicazione utilizza indirettamente la libreria MFC quando altre DLL utilizzate da un'applicazione utilizza le funzioni di CString MFC.
    • Ricreare la libreria MFC con MBCS=0. Aggiungere il file MFC42.LIB all'impostazione di progetto "Ignora librerie", quindi collegare la libreria MFC personalizzata all'applicazione. Fare riferimento alle note tecniche TN033 per informazioni sulle procedure di ricreazione della DLL MFC.

Status

Microsoft ha confermato che questo un bug nei prodotti Microsoft elencati all'inizio di questo articolo. Questo problema è stato innanzitutto corretto in Windows 2000 Service Pack 2.

Informazioni

Procedura per riprodurre il problema.

  • Creare un progetto di applicazione console Win32 con il codice riportato di seguito:
    #include <windows.h>
    #include <tchar.h>
    #include <process.h>
    #include <stdio.h>
    
    unsigned int __stdcall threadfunc(void *)
    {
        for (int v = 0; v <= 10000000; ++v)
    	_istspace(' ');
    	return 0;
    }
    
    int main(int argc, char **argv)
    {
        if (argc != 2)
    	{
    		printf("Usage: <appname.exe> <# of threads>\n");
    		exit(1);
    	}
    
        int nthreads = atoi(argv[1]);
        //int nthreads = _ttoi(argv[1]);  //UNICODE version
    
        HANDLE *handles = new HANDLE[nthreads];
    	unsigned int *threadID = new unsigned int[nthreads];
    
        for (int i = 0; i < nthreads; ++i) {
    	handles[i] = (HANDLE) _beginthreadex(NULL, 0, &threadfunc, NULL, 0, &threadID[i]);
        }
    
        WaitForMultipleObjects(nthreads, handles, TRUE, INFINITE);
    
    	delete [] handles;
    	delete [] threadID;
    
        return 0;
    }
    						

  • Compilare l'applicazione con il file Msvcrt.dll, libreria run-time DLL multithread. Il progetto viene generato con la direttiva di processore _MBCS per impostazione predefinita e _istspace() è mappato a _ismbcspace() . L'esecuzione di questa applicazione sarà più lenta in Windows 2000 e Windows ME rispetto a Windows NT 4.0 e Windows 9x.

Riferimenti

"Stringhe: Panoramica," "caratteri multibyte (MBCS): Overview"e"programmazione Unicode: Panoramica" in MSDN nella documentazione di Visual c ++ / Visual c ++ Programmer Guida / aggiunta /Overviews di funzionalità del programma.

TN033: Versione DLL di MFC

Proprietà

Identificativo articolo: 264795 - Ultima modifica: sabato 1 febbraio 2014 - Revisione: 3.3
Le informazioni in questo articolo si applicano a:
  • Microsoft Windows 2000 Server
  • Microsoft Windows 2000 Advanced Server
  • Microsoft Windows 2000 Professional Edition
Chiavi: 
kbnosurvey kbarchive kbmt kbhotfixserver kbqfe kbbug kbcrt kbfix KB264795 KbMtit
Traduzione automatica articoli
Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 264795
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com