Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Что быстрее / 21 сообщений из 21, страница 1 из 1
16.02.2004, 13:14
    #32410366
Гость_xxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее
Господа, просвятите плиз по такому вопросу :
Что быстрее работает : присвоение значение локальной переменной или
запись значения в свойсво объекта.
Код: plaintext
1.
2.
 1 ) Local luVAl
luVAl  =  ""
2 ) this.Val =""

Буду признателен.
...
Рейтинг: 0 / 0
16.02.2004, 13:18
    #32410384
Hel!Riser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее
фс:е дело в видимости переменной ;) а уже как быстро она запомница имхо роли не играет :))
...
Рейтинг: 0 / 0
16.02.2004, 13:27
    #32410399
Гость_xxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее
Достопочтенный Сэр. Это для вас не играет, а для нас играет :)
Лучше бы что нить конструктивное сказали, очень надо.
...
Рейтинг: 0 / 0
16.02.2004, 13:30
    #32410403
NNN
NNN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее
Самому лень проверить? :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CLEAR 
LOCAL i, n, x, y
x=CREATEOBJECT('custom')
x.AddProperty('y')
?'Variable:'
n=SECONDS()
FOR i= 1  TO  10000 
	y =  0 
ENDFOR
?SECONDS()-n
?'Property:'
n=SECONDS()
FOR i= 1  TO  10000 
	x.y =  0 
ENDFOR
?SECONDS()-n
RELEASE ALL 
...
Рейтинг: 0 / 0
16.02.2004, 14:54
    #32410564
Что быстрее
Присваивание свойству, естественно, медленнее, чем присваивание локальной переменной. То же относится и к вызову метода формы (медленно)или глобальной процедуры (быстро), описанной в .prg.
Что касательно последнего ответа, то если сделать:

LOCAL xxx as custom (custom - имя COM-сервера, например, Excel.Application), то
xxx = CREATEOBJECT('custom')
будет намного быстрее, так как используется раннее связывание.
...
Рейтинг: 0 / 0
16.02.2004, 15:27
    #32410628
Crip
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее
LOCAL xxx as custom (custom - имя COM-сервера, например, Excel.Application), то
xxx = CREATEOBJECT('custom')
будет намного быстрее, так как используется раннее связывание.


Кто вам сказал что при этом используется раннее связывание?... Здесь вам не тут, то есть фокс это не VB.
...
Рейтинг: 0 / 0
16.02.2004, 15:32
    #32410637
Что быстрее
Раз Вы Всё знаете - то может, популярно просветите, для чего тогда это сделано в Fox'е (конструкция AS для ссылки на объект при объявлении переменной)? И чем это отличается от аналогичных конструкций в VB. А ещё лучше - поподробнее почитайте про полиморфизм...
А то если Microsoft не сказала, что здесь явное раннее связавание, то значит, и нет его!
Кстати, попробуйте этот код - убедитесь, что действительно быстрее...
...
Рейтинг: 0 / 0
16.02.2004, 16:58
    #32410815
Crip
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее
Раз Вы Всё знаете - то может, популярно просветите, для чего тогда это сделано в Fox'е (конструкция AS для ссылки на объект при объявлении переменной)?
Для Intellisence
Кстати, попробуйте этот код - убедитесь, что действительно быстрее...
сегодня

У вас есть конкретные замеры?
Мы уже когда-то подробно обсуждали это с В.Журавлевым.
В случае с Excel нет раннего связывания даже при прямом
xxx= createobjectex("Excel.Application","","")
Может быть в VFP8 , что-то изменилось, но я очень сомневаюсь.
...
Рейтинг: 0 / 0
16.02.2004, 17:43
    #32410902
Что быстрее
Привожу код из MSDN по VB.

Dim xlApp As Object ' Declare variable to hold the reference.

Set xlApp = CreateObject("excel.application")
xlApp.Visible = True
xlApp.QuitSet xlApp = Nothing ' убираем мусор

Это позднее связывание, так как переменная xlApp объявлена как объектная, но не связана с каким-либо объектом.
В следующем примере (так же из MSDN)

Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.WorkSheet
Set xlApp = CreateObject("Excel.Application")
Set xlBook = xlApp.Workbooks.Add
Set xlSheet = xlBook.Worksheets(1)

Это раннее связывание, так как переменная xlApp связана с объектом Excel.Application при объявлении.

Было бы наивным полагать, что только ради IntelliSense Microsoft придумала все эти заморочки. Поэтому код на VFP:

LOCAL oExcel As Excel.Application
oExcel = CreateObject('Excel.Application')

использует раннее связывание. Читайте про полиморфизм...
...
Рейтинг: 0 / 0
16.02.2004, 17:54
    #32410920
Crip
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее
"Не надо булочной , не надо прачечной"
VB и VFP это совершенно разные языки.
Вы мне код на VFP приведите сравнивающий по производительности вот эти 2 варианта
Код: plaintext
1.
LOCAL oExcel As Excel.Application 
oExcel = CreateObject('Excel.Application') 

Код: plaintext
1.
LOCAL oExcel 
oExcel = CreateObject('Excel.Application') 

А тыкать носом в MSDN я и сам умею...
...
Рейтинг: 0 / 0
16.02.2004, 18:39
    #32410970
Что быстрее
А самому не придумать?
Не верите мне - задайте вопрос разработчикам из MicroSoft.
Успехов!
P.S. Типизация для переменных памяти появилась только в VFP7. Я полагаю, что форум нужен для того, чтобы сообщать друг другу о новых возможностях языка, а не для дискурсий типа "этого не может быть, потому что этого не может быть никогда!"
...
Рейтинг: 0 / 0
16.02.2004, 19:08
    #32411009
Crip
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее
задайте вопрос разработчикам из MicroSoft
Это уже делал выше упомянутый В.Журавлев. Нет там никого раннего связывания и не надо думать, что вы умнее всех... Кстати я тогда тоже наивно верил, в то, что раннее связывание имеет место быть. Завтра постараюсь найти ссылку на этот флейм.
...
Рейтинг: 0 / 0
16.02.2004, 22:08
    #32411106
hDrummer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее
серьёзное обсуждение серьёзной проблемы.
полный респект :)
...
Рейтинг: 0 / 0
17.02.2004, 08:57
    #32411262
Что быстрее
Уважаемый CRIP! Ваше упрямство непреодолимо. Может быть, Вам стоит почитать FoxHelp, раздел Early (vtable) and Late (IDispatch) Binding for VFP8? Аналогичный раздел есть и в Help for VFP7, но там примеры только для VB. Или загляните на http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_foxhelp/html/newEarly_and_Late_Binding.asp
Там, правда, американскими буквами, написано что-то про Early binding for VFP .
Интересно, а у кого конкретно в Microsoft ваш коллега Журавлёв консультируется?
Теперь о том, что быстрее работает - про CreateObject. Вы, как специалист, вероятно, знаете, что компилируемый код (тот, который непосредственно работает с объектом после его создания) для раннего связывания сильно отличается от кода для позднего связывания. В первом случае явно используются интерфейсы (они уже известны во время компиляции), во втором - создаются ссылки типа External, которые будут реализованы только на этапе выполнения. Именно здесь и имеет место выигрыш в скорости. Поэтому Ваш вопрос не совсем корректен. Хотя в случае позднего связывания CreateObject будет работать чуть медленнее - в зависимости от размера реестра.
Недавно я закончил приложение, где, по требованию заказчика, формировалось огромное количество таблиц в Excel. Разница в скорости ощутима даже для четвёртого пенька 2,4 ггц 256 метров ОЗУ. Причём был использован именно тот синтаксис, который я указал выше (а не CreateObjectEX - по моему, это не совсем удачный пример от Microsoft. Кстати, на Ваш взгляд, нет ли ошибки в команде LOCAL для примера с поздним связыванием в Help'е?).
...
Рейтинг: 0 / 0
17.02.2004, 09:46
    #32411318
NNN
NNN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее
2 Вячеслав Клепинин

> для чего тогда это сделано в Fox'е (конструкция AS для ссылки на объект при объявлении переменной)?

ИМХО, (не помню, где я это видел) но проверка типа происходит только в COM-серверах. Во-всяком случае, теперь свойства и методы отобращаюся в VB Object Viewer с правильными типами.

CripМожет быть в VFP8 , что-то изменилось, но я очень сомневаюсь.
Делее по ссылкам:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fox7help/html/newEarly_and_Late_Binding.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_foxhelp/html/newEarly_and_Late_Binding.asp

В хелпе для vfp7 этой фразы нет:
In Visual FoxPro, you would use the CREATEOBJECT() function rather than the CREATEOBJECTEX() function.

Хотя эта фраза есть в обоих вариантах:
CREATEOBJECTEX( ) supports creation of new early-bound objects. However, it is also possible that your Visual FoxPro component is passed an object that you want to call via early-binding. You can use the GETINTERFACE( ) support on existing COM objects.

Кстати, на Ваш взгляд, нет ли ошибки в команде LOCAL для примера с поздним связыванием в Help'е?).

На мой взгляд нет
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
CLEAR 
LOCAL i, n
***
LOCAL x as excel.application
n=SECONDS()
x=CREATEOBJECT('excel.application')
?SECONDS()-n
n=SECONDS()
FOR i= 1  TO  10000 
	x.Caption='xxx'
ENDFOR 
?SECONDS()-n
x.Quit 
RELEASE x
***
LOCAL x as excel.application
n=SECONDS()
x=CREATEOBJECTEX('excel.application','','')
?SECONDS()-n
n=SECONDS()
FOR i= 1  TO  10000 
	x.Caption='xxx'
ENDFOR 
?SECONDS()-n
x.Quit 
RELEASE x
*** 
LOCAL x 
LOCAL i, n
n=SECONDS()
x=CREATEOBJECT('excel.application')
?SECONDS()-n
n=SECONDS()
FOR i= 1  TO  10000 
	x.Caption='xxx'
ENDFOR 
?SECONDS()-n
x.Quit 
RELEASE x
*** 
LOCAL x 
n=SECONDS()
x=CREATEOBJECTEX('excel.application','','')
?SECONDS()-n
n=SECONDS()
FOR i= 1  TO  10000 
	x.Caption='xxx'
ENDFOR 
?SECONDS()-n
x.Quit 
RELEASE x 


CREATEOBJECTEX работает быстрее, примерно на 1/4, но этот никак не зависит от AS TYPE.
...
Рейтинг: 0 / 0
17.02.2004, 11:06
    #32411492
Crip
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее
2NNN
Вообще-то CreateObjectEx() вообще нормально не работает...
Попробуйте этот код...
Код: plaintext
1.
2.
3.
4.
PUBLIC goE as Excel.Application
goE = CREATEOBJECTEX( "Excel.Application" , ""," ")
goE.Workbooks.Add()
goE.Visible = .T.
goE.Cells( 1 , 1 ).Value =  1 
...
Рейтинг: 0 / 0
17.02.2004, 11:18
    #32411534
Crip
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее
Вячеслав Клепинин
Здесь было обсуждение
...
Рейтинг: 0 / 0
17.02.2004, 12:13
    #32411637
Что быстрее
Да, действительно, при создании Excel через CreteObjectEX непосредственное обращение к ячейке не работает, требуется использовать ActiveSheet, что резко тормозит. Можно сделать:

LOCAL xl as excel.application, xs as excel.application.activesheet
xl = CreateObjectEX('excel.application','','')
xl.WorkBooks.add()
xs = xl.ActiveSheet && !!!!

тогда

xs.Cells(x,y).value = 1 - работает, и скорость резко возрастает, но не превышает скорости, если объект создан через CreateObject().
Я протестировал пример от NNN, заменив присваивание значения свойству записью в Cells(i,1), где i - переменная цикла. В общем, при использовании AS при объявлении переменной и CreateObject, и CreateObjectEX дают примерно одинаковый результат (при использовании выше приведённого кода с дополнительной xs). Так же в среднем это работает на 15% быстрее, чем без AS, но, как Вы понимаете, это не совсем удачный тест, так как XP пытается делать оптимизацию.
Возможно, WiRuc и прав (насчёт библиотек). В принципе, раннее связывание лучше использовать для собственных COM-серверов, тогда это даст существенный выигрыш. Хотя повторюсь - в реальном приложении, где Excel используется по полной программе, выигпыш (по крайней мере для VFP8) есть. Но могут возникнуть проблемы при переносе на другие машины, где установлена другая версия Excel. Поэтому в данном случае лучше пользоваться поздним связыванием.
...
Рейтинг: 0 / 0
17.02.2004, 13:52
    #32411909
Crip
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее
Я не утверждаю, что VFP не может использовать раннее связывание как таковое. Но в случае с Excel его определенно не происходит.
Как заметил Журавлев есть только некоторый выигрыш в производительности
при LOCAL x as "excel.application" , так как при этом изменяется работа с библиотекой типов.
...
Рейтинг: 0 / 0
17.02.2004, 14:24
    #32412002
Что быстрее
to CRIP:
Последняя фраза - это уже выше моего понимания.
А Ваш В.Журавлёв - это у которого сайт FoxPro Club?
Сходил, посмотрел...
...
Рейтинг: 0 / 0
21.02.2004, 18:14
    #32417821
rst
rst
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее
2Гость_xxx:
по сути без разницы :)
тут лучше следить за логикой и читабельностью кода...

2all: excel просто видимо хитрый вещь -
для всех остальных(нормальных обектов) лучше наверно делать объявление переменной..

2Crip: по приведенной ссылке , кроме того что boba[M] что-то спросл у програмистов MS (хорошо бы еще указал все таки что именно спросил и какой был ответ ) ничего не понятно...
{это не личный наезд }
Я не вижу причин по которым dual интерфейс _Application в случае excelя должен обрабатываться как-то по другому чем остальные...
(Неужели fox проверяет guid интерфейса и в случае _Application действует по отличному пути)?
Либо остается предположить что раннее связывание вообще не используется в фоксе??
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Что быстрее / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]