Прикольная задачка. Чисто на заметку для собеседований )

В общем ситуация такая. Сегодня по работе столкнулся. Если очень просто, то есть клиент флексовый и есть сервер (кажется .NET).

На клиенте происходит что то типа такого


  .....
   for (var i:int=0; i < 100; i++)
   {
     .....
     remoteObject.getResultFromService(new mx.rpx.Responder(resultHandler, faultHandler);
   ....
   }
   ....


То есть заходим в цикл, что то там делаем и инвокаем по результату этого того что то там на сервере ))))

Внимание знатоки ))) Сколько будет http/amf запросов )? Для тех кто знает что такое флеш — ответ скорее всего очевиден, но для того кто плавает, как показала практика, это ловушка которая очень сильно влияет на производительность всей системы.
  • +1
  • 17 июля 2010, 08:20
  • cyril

Комментарии (5)

RSS свернуть / развернуть
+
0
1. это относится к флексологии?
2. мой ответ на вопрос: капитан очевидность говорит, что 100 запросов. но думается, что всего один, так сказать, пакет комманд в одном запросе.
avatar

degtyarchuk

  • 17 июля 2010, 09:00
+
0
К.О. думает логически. Но тут прикол имено флешевский ) Думается правильно. А знаешь почему?
avatar

cyril

  • 17 июля 2010, 09:13
+
0
не знаю (((
avatar

degtyarchuk

  • 17 июля 2010, 09:26
+
0
Да ) Это флексовая муристика )
avatar

cyril

  • 17 июля 2010, 09:12
+
+1
Флаш это фреймы. То есть вот эта вот хрень отработает в одном фрейме:

for (var i:int=0; i < 100; i++)
   {
     .....
     remoteObject.getResultFromService(new mx.rpx.Responder(resultHandler, faultHandler);
   ....
   }


Соберет все вместе и отправит на сервер один реквест.

А если на сервере будет происходить что то что простыми словами можно выразить как
public String getResultFromService()
	{
		try
		{
			Thread.sleep(1000);
		} catch (InterruptedException e)
		{
			// ku ku ))
		}
		return new Date(System.currentTimeMillis()).toString();
	}


И на стороне клиента будет обрабатываться какой нибудь массив с пару сотнями записей то представьте сколько клиент будет ждать ответ с сервера? ))) дооооолго придолго.

Решение простое. Надо просто делать один инвок серверного метода в одном фрейме. Тогда все ускоряется на порядки и никто ничего не ждет,
private var counter:int=0;

...
			private function init():void
			{
				// remote object initialization

			}

			private function doWithCallLater():void
			{
				if (counter < 100)
				{
					callLater(getResultWithCallLater);
				}

			}

			private function getResultWithCallLater():void
			{
				myService.getResultFromService(new mx.rpc.Responder(handleResult, handleFault));
				counter++;
				doWithCallLater();

			}


Если очень коротко, то этот код работает как
invoke the method -> sent request -> get to the next frame ->invoke the method

Больше информации по следующей ссылке
livedocs.adobe.com/flex/3/html/help.html?content=layoutperformance_12.html

avatar

cyril

  • 17 июля 2010, 09:46

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.
Не забываем смотреть статистику:

Яндекс цитирования