Страница: 1 |
|
Вопрос: Есть ли смысл переводить на ASM? или хватит C++?
|
Добавлено: 30.11.05 09:05
|
|
Автор вопроса: Comanche
|
Есть VB-шный код по выкладке двумерного массива в буфер обмена в формате HTML (в виде таблицы). Я и так уже отказался от бэйсиковской конкатенации строк, задействовав класс cAllocMem от sne. Но всё равно на больших объёмах данных скорость меня не устраивает.
Вопрос: имеет ли смысл переводить код на ASM, или же ограничиться переводом на C++? и ещё: переводя на C++, стоит ли конкатенировать строки тем же макаром (а ля sne), или же вполне будет достаточно и встроенных возможностей Си?
Вот, кстати, код:
' Стартовый фрагмент:
sStart = "<HTML><HEAD><STYLE>TD {mso-number-format:'\@';}</STYLE></HEAD><BODY><TABLE style=border-collapse:collapse>"
' Конкатенацию выполняем при помощи класса cAllocMem (на порядок быстрее, чем средствами VB!):
Set a = New cAllocMem
For i = LBound(vArr, 2) To UBound(vArr, 2)
a.WriteString "<TR>"
For j = 0 To UBound(sFieldNames)
a.WriteString "<TD>"
a.WriteString IIf(IsNull(vArr(j, i)), "", vArr(j, i))
a.WriteString "</TD>"
Next
a.WriteString "</TR>"
Next
sFrag = a.ReadString(0, a.Size) ' << результат конкатенации
' Конечный фрагмент:
sEnd = "</TABLE></BODY></HTML>"
a.Clear ' << чистимся
Set a = Nothing ' << --- " ---
PutHTMLClipboard sFrag, sStart, sEnd ' << используем процедуру от Майкрософта (http://support.microsoft.com/kb/274326/en-us)
Примечания:
1. Код PutHTMLClipboard здесь не привожу - вполне может быть, что её можно будет оставить как есть, т.е. на VB6; основное торможение - на циклах с конкатенацией, что и хоцца ускорить.
2. Код класса cAllocMem есть, по-моему, в "Примерах" или же в "Библиотеке кодов". Так что тоже не привожу. Вероятно, это ограничит список вступивших в дискуссию только уважаемым sne :))
3. Предвижу комментарий: "да тут ASM - это из пушки по воробьям!". Вполне может быть! потому и спрашиваю! Просто требования к скорости - очень критичные!
Ответить
|
Номер ответа: 3 Автор ответа: HOOLIGAN
Вопросов: 0 Ответов: 1066
|
Профиль | | #3
|
Добавлено: 30.11.05 20:26
|
Что там в cAllocMem действительно хз, можно предположить, что используется паскалевское представление строки, что значительно ускоряет работу с ней. Если скорость так критична, можешь реализовать этот класс на си, уйдя от си-строк и используя паскальные строки. И не стоит доводить дело до исключений, можно контролировать длину строки, чтобы она вписывалась в выделенную память. А лишние ACCESS_VIOLATION - это огромный тормоз.
Либо если уверен, что сможешь оптимизировать лучше, чем cl.exe, то пиши на асме
Сделать лучше, чем имеется, можно всегда, какой бы невыполнимой задача не казалась.
Ответить
|
Страница: 1 |
Поиск по форуму