سؤال

إليك الكود الذي أريد تسريعه.إنها تحصل على قيمة من مجموعة سجلات ADO وتقوم بتحويلها إلى char*.ولكن هذا بطيء.هل يمكنني تخطي إنشاء _bstr_t؟

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

                if (V_VT(&var) == VT_BSTR)
                {
                    char* p = (const char*) (_bstr_t) var;
هل كانت مفيدة؟

المحلول

تحتوي البايتات الأربعة الأولى من BSTR على الطول.يمكنك التكرار والحصول على كل حرف آخر إذا كان Unicode أو كل حرف إذا كان متعدد البايت.قد يعمل أيضًا نوع من memcpy أو طريقة أخرى.IIRC، وهذا يمكن أن يكون أسرع من W2A أو الصب (LPCSTR)(_bstr_t)

نصائح أخرى

مشكلتك (بخلاف إمكانية وجود نسخة ذاكرة داخل _bstr_t) هي أنك تقوم بتحويل UNICODE BSTR إلى حرف ANSI*.

يمكنك استخدام وحدات الماكرو USES_CONVERSION التي تقوم بإجراء التحويل على المكدس، لذا قد تكون أسرع.وبدلاً من ذلك، احتفظ بقيمة BSTR كـ Unicode إن أمكن.

لتحويل:

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

// ...

free(p);

تذكر - السلسلة التي تم إرجاعها من OLE2A (ووحدات الماكرو الشقيقة لها) تُرجع سلسلة مخصصة على المكدس - ارجع من النطاق المتضمن ولديك سلسلة غير مرغوب فيها ما لم تقم بنسخها (وتحريرها في النهاية، بوضوح)

يؤدي هذا إلى إنشاء مؤقت على المكدس:

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

يستخدم هذا بناء جملة أحدث قليلاً وربما يكون أكثر قوة.له حجم قابل للتكوين، وبعد ذلك سيستخدم الكومة بحيث يتجنب وضع سلاسل ضخمة على المكدس:

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

يمكنك أيضًا جعل هذه المهمة أسرع عن طريق تجنب تجميع الحقول معًا.يجب عليك استخدام مجموعة الحقول فقط عندما تحتاج إلى استرداد العنصر بالاسم.إذا كنت تعرف الحقول حسب الفهرس، فيمكنك استخدام هذا بدلاً من ذلك.

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

لاحظ أنه لا يمكنني أن أكون عددًا صحيحًا لأن ADO لا يدعم VT_INTEGER، لذا يمكنك أيضًا استخدام متغير طويل.

حسنًا ، أصبح برنامج C++ الخاص بي صدئًا بعض الشيء ...لكنني لا أعتقد أن التحويل هو مشكلتك.هذا التحويل لا يفعل أي شيء حقًا باستثناء إخبار المترجم بأن يعتبر _bstr_t حرفًا*.ثم تقوم فقط بتعيين عنوان هذا المؤشر إلى p.لا شيء يتم "فعله" فعليًا.

هل أنت متأكد من أن الحصول على الأشياء من GetValue ليس بطيئًا فقط؟

أم أن لغة C++ الخاصة بي أكثر صدأًا مما أعتقد ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top