Frage

Hier ist der Code, den ich beschleunigen will. Es hat einen Wert von einem ADO-Re-Cord bekommen und es zu einem char * konvertieren. Aber das ist langsam. Kann ich die Schaffung des _bstr_t überspringen?

                _variant_t var = pRs->Fields->GetItem(i)->GetValue();

                if (V_VT(&var) == VT_BSTR)
                {
                    char* p = (const char*) (_bstr_t) var;
War es hilfreich?

Lösung

Die ersten 4 Bytes des BSTR enthalten die Länge. Sie können eine Schleife durch und jedes andere Zeichen, wenn Unicode oder jedes Zeichen, wenn Multibyte bekommen. Irgendeine Art von memcpy oder eine andere Methode wäre zu arbeiten. IIRC, dies kann schneller sein als W2A oder Gießen (LPCSTR)(_bstr_t)

Andere Tipps

Ihr Problem (außer der Möglichkeit einer Speicherkopie innerhalb _bstr_t) ist, dass Sie die UNICODE BSTR in ein ANSI-Zeichen sind konvertieren *.

Sie können die USES_CONVERSION Makros verwenden, die die Umwandlung auf den Stapel durchführen, so könnten sie schneller sein. Alternativ halten Sie den BSTR Wert als Unicode, wenn möglich.

konvertieren:

USES_CONVERSION;
char* p = strdup(OLE2A(var.bstrVal));

// ...

free(p);

erinnern - die Zeichenfolge aus OLE2A zurückgegeben (und seiner Schwester Makros) zurückgeben eine Zeichenfolge, die auf dem Stack zugeordnet ist - Rückkehr aus dem umschließenden Umfang und Sie Müll Zeichenfolge haben, wenn Sie es kopieren (und frei, um es schließlich, natürlich)

Dies erzeugt eine temporäre auf dem Stapel:

USES_CONVERSION;
char *p=W2A(var.bstrVal);

Diese verwendet eine etwas neuere Syntax und ist wahrscheinlich robuster. Es verfügt über eine konfigurierbare Größe, über die hinaus wird es den Heap verwenden, so dass es massive Saiten auf den Stapel vermeidet setzen:

char *p=CW2AEX<>(var.bstrVal);
_variant_t var = pRs->Fields->GetItem(i)->GetValue(); 

Sie können auch diese Zuordnung schneller machen, indem die Felder Sammlung alle zusammen zu vermeiden. Sie sollten nur die Fields-Auflistung verwenden, wenn Sie das Element mit Namen abrufen müssen. Wenn Sie die Felder von Index kennen, können Sie stattdessen diese verwenden.

_variant_t vara = pRs->Collect[i]->Value;

Hinweis i nicht eine ganze Zahl sein kann, wie ADO VT_INTEGER nicht unterstützt, so dass Sie könnte genauso gut eine lange Variable verwenden.

Ok, mein C ++ ist ein wenig rostig bekommen ... aber ich glaube nicht, die Umwandlung Ihr Problem. Diese Umwandlung tut nicht wirklich etwas außer dem Compiler sagen, ein Zeichen zu betrachten _bstr_t *. Dann sind die Zuweisung Sie nur die Adresse dieser Zeiger auf p. Nichts ist eigentlich „gemacht.“ Wobei

Sind Sie sicher, dass es nicht nur langsam Sachen aus GetValue bekommen?

Oder ist mein C ++ rustier als ich denke ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top