Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
внутри использует массив, а не список
любые операции надо ними приводят к созданию копии массива
Объект не тот же самый, объект новый.
event Action OnTest = delegate {};
...
OnTest += () => {};
OnTest += () => {};
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Action a = () => { Console.WriteLine("1"); };
Action b = a;
a += () => { Console.WriteLine("2"); };
Console.WriteLine("A:");
a();
Console.WriteLine("B:");
b();
}
}
}A:
1
2
B:
1 public class B
{
public event Action evt = () => { };
public void Call()
{
evt();
}
}
public class A
{
private B _b;
private Action a = () => { };
public A(B b)
{
_b = b;
_b.evt += a;
}
public event Action evt
{
add { a += value; }
remove { a -= value; }
}
}
class Program
{
static void Main(string[] args)
{
B b = new B();
A a = new A(b);
a.evt += () => Console.WriteLine("1");
b.evt += () => Console.WriteLine("2");
b.Call();
}
}
2Спасибо, проведу тесты в standalone и добавлю инфу
А какой использовать? Я не нашел лучше варианта
Test environment
We will run 10000 iterations and will repeat this process 10 times, then will take average result time. We will measure time for calling our callbacks for one event at each implementation. As we will do this inside Unity we should knows that:
We can’t use Time.realtimeSinceStartup for performance measurements — accuracy is very low. Instead we will use standard System.Diagnostics.Stopwatch class.
We can’t start measure right on game start — Unity needs time to full initialization, we should wait few seconds when hardware resources will be freed. 3 seconds — enough for this test.
Editor always compiles and runs code in DEBUG mode. For proper measure we need RELEASE version — we should creates standalone build and makes measurements with this build outside Unity editor. We will use Debug.Log method for save results to external logs.
Можно какой нибудь пример реализации? Не уверен, что правильно понимаю о чем речь, но интересно протестировать
public interface INaiveObservable<T>
{
void Subscribe(INaiveObserver<T> observer);
void Unsubscribe(INaiveObserver<T> observer);
}
public interface INaiveObserver<T>
{
void OnValue(T value);
}
public class NaiveObservable<T>: INaiveObservable<T>
{
readonly List<INaiveObserver<T>> _observers = new List<INaiveObserver<T>>();
public void Subscribe(INaiveObserver<T> observer)
{
_observers.Add(observer);
}
public void Unsubscribe(INaiveObserver<T> observer)
{
_observers.Remove(observer);
}
public void Push(T value)
{
//No exception handling
//No Subsribe/unsubscribe inside subscribers
//This is a naive implementation
foreach (var observer in _observers)
{
observer.OnValue(value);
}
}
}
public class WritingObserver<T> : INaiveObserver<T>
{
void INaiveObserver<T>.OnValue(T value)
{
Console.WriteLine(value);
}
}
class Program
{
static void Main(string[] args)
{
NaiveObservable<int> observable = new NaiveObservable<int>();
WritingObserver<int> observer = new WritingObserver<int>();
observable.Subscribe(observer);
observable.Push(10);
observable.Push(11);
observable.Push(12);
}
}
Спасибо за статью. Рельно удивлен что реализация через делегат настолько быстрее чем Event System.
Итак, данные в консоли и мы видим интересную картину — функция на получателе отработала в ~2,7 раза быстрее чем на отправителе.
Я так и не понял с чем это связано. Может в том, что на получателе после расчета времени дополнительно вызывается Debug.Log или в чем то другом… Если кто знает, то напишите мне и я внесу это в статью.
Спасибо за статью.
Про Debug.Log он действительно очень тормозит.
Можно попробовать без него или посмотреть профайлером.
Сравнение скорости разных вариантов взаимодействия скриптов Unity3D