Почему я вижу более медленную производительность здесь от WCF, чем Дистанционная работа?

Вы рассмотрели рассмотрение реализации NSCoding Протокол? Это позволит Вам, кодируют и декодируют на iPhone с двумя простыми методами, которые реализованы с NSCoding. Сначала Вам было бы нужно к добавлению NSCoding к Вашему Классу.

Вот пример:

Это находится в.h файле

@interface GameContent : NSObject <NSCoding>

Затем, необходимо будет реализовать два метода Протокола NSCoding.

    - (id) initWithCoder: (NSCoder *)coder
    {
        if (self = [super init])
        {
               [self setFoundHotSpots:[coder decodeObjectForKey:@"foundHotSpots"]];
        }
        return self;
    }

    - (void) encodeWithCoder: (NSCoder *)coder
    {
           [coder encodeObject:foundHotSpots forKey:@"foundHotSpots"];
    }

Выезд документация относительно NSCoder для получения дополнительной информации. Это натолкнулось действительно удобное на мои проекты, где я должен сохранить состояние приложения на iPhone, если приложение закрывается, и восстановите его назад к, он - состояние когда его спина на.

ключ должен добавить протокол к интерфейсу и затем реализовать два метода, которые являются частью NSCoding.

я надеюсь, что это помогает!

14
задан Mark 19 August 2009 в 14:14
поделиться

1 ответ

Примечания

По большей части время тратится на настройку и отключение WCF. канал. Другая львиная доля времени, похоже, тратится на работу в отладчике. Имейте в виду, что это действительно неформальное тестирование типов .. :)

Мне удалось воспроизвести ваши числа, поэтому я начал с этого. Это показало, что номера WCF примерно в 3 раза больше, чем номера удаленного взаимодействия.

При кэшировании фабрики каналов (и соответствующих объектов удаленного взаимодействия) числа упали, так что WCF был только в 2 раза больше, чем ] номера удаленного доступа.

После проверки дюжины других различных настроек, единственное, что, казалось, сократило сколько-нибудь реально измеримое время с цифр, - это очистить все поведение службы отладки (добавлено по умолчанию) - это дало примерно ~ 100 мс. Недостаточно, чтобы по-настоящему волноваться.

Затем, по прихоти, я запустил код вне отладчика в конфигурации выпуска . Числа упали до , что примерно эквивалентно количеству удаленного доступа, если не лучше . Лоб ударил по столу и объявил, что все готово.

Вкратце, вы должны увидеть примерно то же самое, с возможностью повышения производительности с помощью WCF и получения лучшей модели программирования для загрузки.

Пример выполнения

remoting 1 test run in 347ms    
wcf      1 test run in 1544ms    
remoting 2 test run in 493ms    
wcf      2 test run in 324ms
remoting 3 test run in 497ms
wcf      3 test run in 336ms
remoting 4 test run in 449ms
wcf      4 test run in 289ms
remoting 5 test run in 448ms
wcf      5 test run in 284ms
remoting 6 test run in 447ms
wcf      6 test run in 282ms
remoting 7 test run in 439ms
wcf      7 test run in 281ms
remoting 8 test run in 441ms
wcf      8 test run in 278ms
remoting 9 test run in 441ms
wcf      9 test run in 278ms
remoting 10 test run in 438ms
wcf      10 test run in 286ms

Код

Примечание - этот код был полностью подделан. Я прошу прощения. : )

using System;
using System.ServiceModel;
using System.Runtime.Serialization;



[ServiceContract]
interface IWorkerObject
{
    [OperationContract]
    Outcome DoWork(Input t);
}

[DataContract]
[Serializable]
class Input
{
    [DataMember]
    public int TaskId { get; set; }
    [DataMember]
    public int ParentTaskId { get; set; }
    [DataMember]
    public DateTime DateCreated { get; set; }
    [DataMember]
    public string TextData { get; set; }
    [DataMember]
    public byte[] BinaryData { get; set; }
}

[DataContract]
[Serializable]
class Outcome
{
    [DataMember]
    public string Result { get; set; }
    [DataMember]
    public string TextData { get; set; }
    [DataMember]
    public byte[] BinaryData { get; set; }

}

class Program
{
    static AppDomain dom = AppDomain.CreateDomain("wcf domain", null);
    static WorkerObject dcnt = dom.CreateInstanceFromAndUnwrap(System.Reflection.Assembly.GetExecutingAssembly().Location, typeof(WorkerObject).FullName) as WorkerObject;
    static ChannelFactory<IWorkerObject> fact = new ChannelFactory<IWorkerObject>(new NetNamedPipeBinding(NetNamedPipeSecurityMode.None), "net.pipe://localhost/the_channel");
    static IWorkerObject chan = fact.CreateChannel();
    static AppDomain remdom = AppDomain.CreateDomain("remoting domain", null);
    static IWorkerObject remoteObject;

    static void Main(string[] args)
    {

        remoteObject = remdom.CreateInstanceFromAndUnwrap(System.Reflection.Assembly.GetExecutingAssembly().Location, typeof(WorkerObject).FullName) as IWorkerObject;


        dcnt.OpenChannel();


        int numberOfIterations = 10;

        for (int i = 1; i <= numberOfIterations; i++)
        {
            run_rem_test(i);
            run_wcf_test(i);
        }

        fact.Close();

        dcnt.CloseChannel();

        AppDomain.Unload(dom);
        AppDomain.Unload(remdom);



    }

    static void run_rem_test(int iteration)
    {

        RunTest("remoting " + iteration, remoteObject);


    }

    static void run_wcf_test(int iteration)
    {


        RunTest("wcf      " + iteration, chan);

    }

    static void RunTest(string test, IWorkerObject dom)
    {
        var t = new Input()
        {
            TextData = new string('a', 8192),
            BinaryData = null,
            DateCreated = DateTime.Now,
            TaskId = 12345,
            ParentTaskId = 12344,
        };

        var sw = System.Diagnostics.Stopwatch.StartNew();

        for (var i = 0; i < 1000; i++)
            dom.DoWork(t);

        sw.Stop();

        Console.WriteLine("{1} test run in {0}ms", sw.ElapsedMilliseconds, test);
    }

}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
class WorkerObject : MarshalByRefObject, IWorkerObject
{
    ServiceHost m_host;

    public void OpenChannel()
    {
        m_host = new ServiceHost(typeof(WorkerObject));


        m_host.AddServiceEndpoint(typeof(IWorkerObject), new NetNamedPipeBinding(NetNamedPipeSecurityMode.None), "net.pipe://localhost/the_channel");

        // cache our ServiceBehaviorAttribute, clear all other behaviors (mainly debug)
        // and add our ServiceBehavior back
        //
        var b = m_host.Description.Behaviors[0] as ServiceBehaviorAttribute;


        m_host.Description.Behaviors.Clear();

        m_host.Description.Behaviors.Add(b);



        m_host.Open();
    }

    public void CloseChannel()
    {
        m_host.Close();
    }

    public Outcome DoWork(Input t)
    {
        return new Outcome()
        {
            TextData = new string('b', 8192),
            BinaryData = new byte[1024],
            Result = "the result",
        };
    }

}
19
ответ дан 1 December 2019 в 13:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: