From c800d3b7fc8ee5b6e555a22950b6513e826578cc Mon Sep 17 00:00:00 2001 From: Ogoun Date: Tue, 9 Apr 2019 15:27:32 +0300 Subject: [PATCH] Fast setter fix --- ...l.Discovery.csproj.CoreCompileInputs.cache | 2 +- ...el.Discovery.csprojAssemblyReference.cache | Bin 137473 -> 160986 bytes ZeroLevel.UnitTests/SerializationTests.cs | 160 ++++++++++++++++++ ZeroLevel/Services/DOM/Model/AttachContent.cs | 18 ++ ZeroLevel/Services/DOM/Model/Identifier.cs | 7 + .../Reflection/TypeGetterSetterBuilder.cs | 65 +++++-- .../ZeroLevel.csproj.CoreCompileInputs.cache | 2 +- 7 files changed, 235 insertions(+), 19 deletions(-) diff --git a/ZeroLevel.Discovery/obj/Debug/ZeroLevel.Discovery.csproj.CoreCompileInputs.cache b/ZeroLevel.Discovery/obj/Debug/ZeroLevel.Discovery.csproj.CoreCompileInputs.cache index ed9d14b..1075f0e 100644 --- a/ZeroLevel.Discovery/obj/Debug/ZeroLevel.Discovery.csproj.CoreCompileInputs.cache +++ b/ZeroLevel.Discovery/obj/Debug/ZeroLevel.Discovery.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -affe24c0b0d3f87817c2fa3318e87e4ecf28560f +44c25bb53ca989abffacb949ad26248970e4d0d4 diff --git a/ZeroLevel.Discovery/obj/Debug/ZeroLevel.Discovery.csprojAssemblyReference.cache b/ZeroLevel.Discovery/obj/Debug/ZeroLevel.Discovery.csprojAssemblyReference.cache index e6bf7b18427170d91fe0593845ff2c42ec32586a..6227be23b0ab567d39af3bfdb5ad2468327624a8 100644 GIT binary patch literal 160986 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 F{tt1~uyOzZ literal 137473 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 Byte[][] { null, new byte[] { }, new byte[] { 1 }, new byte[] { 0, 1, 10, 100, 128, 255 } }, comparator); } + + [TestMethod] + public void SerializeCompositeObject() + { + var comparator = new Func((left, right) => + { + var l_bin = MessageSerializer.Serialize(left); + var r_bin = MessageSerializer.Serialize(right); + return ArrayExtensions.UnsafeEquals(l_bin, r_bin); + }); + + MakePrimitiveTest(MakeDocument(), comparator); + } + + private static Document MakeDocument() + { + var doc = new Document(); + doc.Categories.Add(new Category + { + Title = "Algorithms", + Code = "0", + DirectionCode = "Posts" + }); + doc.Categories.Add(new Category + { + Title = "Data compression", + Code = "133", + DirectionCode = "Posts" + }); + doc.Header = "Парадоксы о сжатии данных"; + doc.Summary = "Задача сжатия данных в своей простейшей форме может относиться к числам и их обозначениям. Числа можно обозначать числительными («одиннадцать» для числа 11), математическими выражениями («два в двадцатой» для 1048576), строковыми выражениями («пять девяток» для 99999), именами собственными («число зверя» для 666, «год смерти Тьюринга» для 1954), или произвольными их комбинациями. Годится любое обозначение, по которому собеседник сможет однозначно определить, о каком числе речь. Очевидно, что сообщить собеседнику «факториал восьми» эффективнее, чем эквивалентное обозначение «сорок тысяч триста двадцать». Здесь возникает логичный вопрос: какое обозначение для заданного числа самое короткое?"; + doc.DescriptiveMetadata.Byline = "tyomitch"; + doc.DescriptiveMetadata.Source.Title = "HABR"; + + doc.TagMetadata.Keywords.Add("парадокс берри"); + doc.TagMetadata.Keywords.Add("колмогоровская сложность"); + doc.TagMetadata.Keywords.Add("проблема останова"); + + doc.Identifier.Link = "https://habr.com/en/post/446976/"; + + var builder = new ContentBuilder(doc); + builder.EnterParagraph(); + builder.WriteText("Философ Бертран Рассел в 1908 опубликовал"); + builder.WriteLink("https://ru.wikipedia.org/wiki/%D0%9F%D0%B0%D1%80%D0%B0%D0%B4%D0%BE%D0%BA%D1%81_%D0%91%D0%B5%D1%80%D1%80%D0%B8", "«парадокс Берри»"); + builder.WriteText(", который затрагивает вопрос обозначений чисел с противоположной стороны: какое самое маленькое число, для обозначения которого недостаточно восьмидесяти букв? Такое число обязано существовать: из восьмидесяти русских букв и пробелов можно составить всего 3480 обозначений, значит, с использованием восьмидесяти букв можно обозначить не более 3480 чисел.Значит, некое число, не большее чем 3480, обозначить таким образом невозможно."); + builder.EnterParagraph(); + builder.WriteText("Значит, этому числу будет соответствовать обозначение «самое маленькое число, для обозначения которого недостаточно восьмидесяти букв», в котором всего 78 букв! С одной стороны, это число обязано существовать; с другой, если это число существует, то его обозначение ему не соответствует. Парадокс!"); + builder.EnterParagraph(); + builder.WriteText("Самый простой способ отмахнуться от этого парадокса — сослаться на неформальность словесных обозначений. Мол, если бы в обозначениях допускался лишь конкретно определённый набор выражений, то «самое маленькое число, для обозначения которого недостаточно восьмидесяти букв» не было бы допустимым обозначением, тогда как практически полезные обозначения типа «факториал восьми» остались бы допустимыми."); + builder.EnterParagraph(); + builder.WriteText("Есть ли формальные способы описания последовательности (алгоритма) действий над числами? Есть, и в изобилии — их называют языками программирования. Будем вместо словесных обозначений использовать программы (например, на Python), выводящие нужные числа. Например, для пяти девяток подойдёт программа print(\"9\"*5). По-прежнему будем интересоваться самой короткой программой для заданного числа. Длину такой программы называют колмогоровской сложностью числа; это теоретический предел, до которого заданное число можно сжать."); + builder.EnterParagraph(); + builder.WriteText("Вместо парадокса Берри теперь можно рассмотреть аналогичный: какое самое маленькое число, для вывода которого недостаточно килобайтной программы?"); + builder.EnterParagraph(); + builder.WriteText("Рассуждать будем так же, как и раньше: существует 2561024 килобайтных текстов, значит, килобайтными программами можно вывести не более 2561024 чисел. Значит, некое число, не большее чем 2561024, вывести таким способом невозможно."); + builder.EnterParagraph(); + builder.WriteText("Но напишем на Python программу, которая генерирует все возможные килобайтные тексты, запускает их на выполнение, и если они выводят какое-то число — то добавляет это число в словарь достижимых. После проверки всех 2561024 возможностей, сколько бы времени это ни заняло — программа ищет, какое самое маленькое число отсутствует в словаре, и выводит это число. Кажется очевидным, что такая программа уложится в килобайт кода — и выведет то самое число, которое невозможно вывести килобайтной программой!"); + builder.EnterParagraph(); + builder.WriteText("В чём же подвох теперь? На неформальность обозначений его списать уже нельзя!"); + builder.EnterParagraph(); + builder.WriteText("Если вас смущает то, что наша программа потребует астрономического количества памяти для работы — словарь (или битовый массив) из 2561024 элементов — то можно всё то же самое осуществить и без него: для каждого из 2561024 чисел по очереди перебирать все 2561024 возможных программ, пока не найдётся подходящая. Не важно, что такой перебор продлится очень долго: после проверки менее чем (2561024)2 пар из числа и программы он ведь завершится, и найдёт то самое заветное число."); + builder.EnterParagraph(); + builder.WriteText("Или не завершится? Ведь среди всех программ, которые будут испробованы, встретится while True: pass (и её функциональные аналоги) — и дальше проверки такой программы дело уже не пойдёт!"); + builder.EnterParagraph(); + builder.WriteText("В отличие от парадокса Берри, где подвох был в неформальности обозначений, во втором случае мы имеем хорошо замаскированную переформулировку «проблемы остановки». Дело в том, что по программе невозможно за конечное время определить её вывод.В частности, колмогоровская сложность невычислима: нет никакого алгоритма, который бы позволил для заданного числа найти длину самой короткой программы, выводящей это число; а значит, нет решения и для задачи Берри — найти для заданного числа длину самого короткого словесного обозначения."); + builder.Complete(); + + var c1 = new Comment + { + Id = 0, + RefToId = -1, + Author = "exception13x", + Text = "С каких пор пробелы и запятые стали буквами? Если использовать «символов», то парадокс пропадает.", + Votes = 0, + DateTime = DateTime.Parse("2019-04-09 10:33") + }; + var c2 = new Comment + { + Id = 1, + RefToId = 0, + Author = "tyomitch", + Text = "Почему пропадает?", + Votes = 1, + DateTime = DateTime.Parse("2019-04-09 10:57") + }; + var c3 = new Comment + { + Id = 2, + RefToId = 1, + Author = "exception13x", + Text = "Потому что в фразе «самое маленькое число, для обозначения которого недостаточно восьмидесяти символов» будет 83 символа. Прошу прощения за придирки, меня просто зацепила фраза про 78 букв(которых 69 в исходной фразе)", + Votes = -1, + DateTime = DateTime.Parse("2019-04-09 12:12") + }; + var c4 = new Comment + { + Id = 3, + RefToId = 2, + Author = "kahi4", + Text = "ну поменять 80 на 100 и делов то, \"самое маленькое число, для обозначения которого недостаточно ста символов\".", + Votes = -1, + DateTime = DateTime.Parse("2019-04-09 12:50") + }; + doc.Attachments.Add(new AttachContent("Comment", ContentType.Raw).Write(c1)); + doc.Attachments.Add(new AttachContent("Comment", ContentType.Raw).Write(c2)); + doc.Attachments.Add(new AttachContent("Comment", ContentType.Raw).Write(c3)); + doc.Attachments.Add(new AttachContent("Comment", ContentType.Raw).Write(c4)); + return doc; + } + + private class Comment : + IBinarySerializable, IEquatable + { + public long Id; + public long RefToId; + + public DateTime DateTime; + public string Author; + + public string Text; + public int Votes; + + public void Deserialize(IBinaryReader reader) + { + this.Id = reader.ReadLong(); + this.RefToId = reader.ReadLong(); + this.DateTime = reader.ReadDateTime().Value; + this.Author = reader.ReadString(); + this.Text = reader.ReadString(); + this.Votes = reader.ReadInt32(); + } + + public override bool Equals(object obj) + { + return this.Equals(obj as Comment); + } + + public override int GetHashCode() + { + return this.Id.GetHashCode(); + } + + public bool Equals(Comment other) + { + if (other == null) return false; + return this.Id == other.Id && this.RefToId == other.RefToId && this.Votes == other.Votes; + } + + public void Serialize(IBinaryWriter writer) + { + writer.WriteLong(this.Id); + writer.WriteLong(this.RefToId); + writer.WriteDateTime(this.DateTime); + writer.WriteString(this.Author); + writer.WriteString(this.Text); + writer.WriteInt32(this.Votes); + } + } } } diff --git a/ZeroLevel/Services/DOM/Model/AttachContent.cs b/ZeroLevel/Services/DOM/Model/AttachContent.cs index 3fe83fa..7e79d5b 100644 --- a/ZeroLevel/Services/DOM/Model/AttachContent.cs +++ b/ZeroLevel/Services/DOM/Model/AttachContent.cs @@ -40,9 +40,27 @@ namespace ZeroLevel.DocumentObjectModel Deserialize(reader); } + public AttachContent(string identity, ContentType contentType) + { Identity = identity; ContentType = contentType; } + + public AttachContent(string identity, string caption, ContentType contentType) + { Identity = identity; Caption = caption; ContentType = contentType; } + public AttachContent(string identity, string caption, string description) { Identity = identity; Summary = description; Caption = caption; } + public AttachContent Write(T value) + { + this.Payload = MessageSerializer.SerializeCompatible(value); + return this; + } + + public T Read() + { + if (this.Payload == null || this.Payload.Length == 0) return default(T); + return MessageSerializer.DeserializeCompatible(this.Payload); + } + #region IBinarySerializable public void Serialize(IBinaryWriter writer) diff --git a/ZeroLevel/Services/DOM/Model/Identifier.cs b/ZeroLevel/Services/DOM/Model/Identifier.cs index 0857d81..d9f1f1c 100644 --- a/ZeroLevel/Services/DOM/Model/Identifier.cs +++ b/ZeroLevel/Services/DOM/Model/Identifier.cs @@ -31,6 +31,11 @@ namespace ZeroLevel.DocumentObjectModel /// public string DateLabel; + /// + /// Document unique link + /// + public string Link; + #endregion Fields #region IBinarySerializable @@ -40,6 +45,7 @@ namespace ZeroLevel.DocumentObjectModel writer.WriteInt32(this.Version); writer.WriteLong(this.Timestamp); writer.WriteString(this.DateLabel); + writer.WriteString(this.Link); } public void Deserialize(IBinaryReader reader) @@ -47,6 +53,7 @@ namespace ZeroLevel.DocumentObjectModel this.Version = reader.ReadInt32(); this.Timestamp = reader.ReadLong(); this.DateLabel = reader.ReadString(); + this.Link = reader.ReadString(); } #endregion IBinarySerializable diff --git a/ZeroLevel/Services/Reflection/TypeGetterSetterBuilder.cs b/ZeroLevel/Services/Reflection/TypeGetterSetterBuilder.cs index a2e807a..38e514e 100644 --- a/ZeroLevel/Services/Reflection/TypeGetterSetterBuilder.cs +++ b/ZeroLevel/Services/Reflection/TypeGetterSetterBuilder.cs @@ -49,11 +49,17 @@ namespace ZeroLevel.Services.Reflection Expression.Unbox(instance, field.DeclaringType) : Expression.Convert(instance, field.DeclaringType); var fieldExp = Expression.Field(target, field); - - var typeCode = Type.GetTypeCode(field.FieldType); - var changeTypeMethod = typeof(Convert).GetMethod("ChangeType", new Type[] { typeof(object), typeof(TypeCode) }); - var convertExpression = Expression.Call(changeTypeMethod, inputValue, Expression.Constant(typeCode)); - + UnaryExpression convertExpression; + if (typeof(IConvertible).IsAssignableFrom(field.FieldType)) + { + var typeCode = Type.GetTypeCode(field.FieldType); + var changeTypeMethod = typeof(Convert).GetMethod("ChangeType", new Type[] { typeof(object), typeof(TypeCode) }); + convertExpression = Expression.Convert(Expression.Call(changeTypeMethod, inputValue, Expression.Constant(typeCode)), field.FieldType); + } + else + { + convertExpression = Expression.Convert(inputValue, field.FieldType); + } var assignExp = Expression.Assign(fieldExp, field.FieldType.IsValueType ? Expression.Convert(convertExpression, field.FieldType) : Expression.TypeAs(convertExpression, field.FieldType)); @@ -76,10 +82,19 @@ namespace ZeroLevel.Services.Reflection Expression.Unbox(instance, property.DeclaringType) : Expression.Convert(instance, property.DeclaringType); var method = property.GetSetMethod(true); - var typeCode = Type.GetTypeCode(property.PropertyType); - var changeTypeMethod = typeof(Convert).GetMethod("ChangeType", new Type[] { typeof(object), typeof(TypeCode) }); - var convertExpression = Expression.Call(changeTypeMethod, inputValue, Expression.Constant(typeCode)); - var setterCall = Expression.Call(target, method, Expression.Convert(convertExpression, property.PropertyType)); + + UnaryExpression convertExpression; + if (typeof(IConvertible).IsAssignableFrom(property.PropertyType)) + { + var typeCode = Type.GetTypeCode(property.PropertyType); + var changeTypeMethod = typeof(Convert).GetMethod("ChangeType", new Type[] { typeof(object), typeof(TypeCode) }); + convertExpression = Expression.Convert(Expression.Call(changeTypeMethod, inputValue, Expression.Constant(typeCode)), property.PropertyType); + } + else + { + convertExpression = Expression.Convert(inputValue, property.PropertyType); + } + var setterCall = Expression.Call(target, method, convertExpression); var expr = Expression.Lambda>(setterCall, instance, inputValue); return expr.Compile(); } @@ -96,10 +111,18 @@ namespace ZeroLevel.Services.Reflection var targetExp = Expression.Parameter(typeof(T), "target"); var inputValue = Expression.Parameter(typeof(object), "o"); var fieldExp = Expression.Field(targetExp, field); - var typeCode = Type.GetTypeCode(field.FieldType); - var changeTypeMethod = typeof(Convert).GetMethod("ChangeType", new Type[] { typeof(object), typeof(TypeCode) }); - var convertExpression = Expression.Call(changeTypeMethod, inputValue, Expression.Constant(typeCode)); - var assignExp = Expression.Assign(fieldExp, Expression.Convert(convertExpression, field.FieldType)); + UnaryExpression convertExpression; + if (typeof(IConvertible).IsAssignableFrom(field.FieldType)) + { + var typeCode = Type.GetTypeCode(field.FieldType); + var changeTypeMethod = typeof(Convert).GetMethod("ChangeType", new Type[] { typeof(object), typeof(TypeCode) }); + convertExpression = Expression.Convert(Expression.Call(changeTypeMethod, inputValue, Expression.Constant(typeCode)), field.FieldType); + } + else + { + convertExpression = Expression.Convert(inputValue, field.FieldType); + } + var assignExp = Expression.Assign(fieldExp, convertExpression); return Expression.Lambda>(assignExp, targetExp, inputValue).Compile(); } @@ -118,10 +141,18 @@ namespace ZeroLevel.Services.Reflection Expression.Unbox(instance, method.DeclaringType) : Expression.Convert(instance, method.DeclaringType); var value = Expression.Parameter(typeof(object), "v"); - var typeCode = Type.GetTypeCode(property.PropertyType); - var changeTypeMethod = typeof(Convert).GetMethod("ChangeType", new Type[] { typeof(object), typeof(TypeCode) }); - var convertExpression = Expression.Call(changeTypeMethod, value, Expression.Constant(typeCode)); - var setterCall = Expression.Call(target, method, Expression.Convert(convertExpression, property.PropertyType)); + UnaryExpression convertExpression; + if (typeof(IConvertible).IsAssignableFrom(property.PropertyType)) + { + var typeCode = Type.GetTypeCode(property.PropertyType); + var changeTypeMethod = typeof(Convert).GetMethod("ChangeType", new Type[] { typeof(object), typeof(TypeCode) }); + convertExpression = Expression.Convert(Expression.Call(changeTypeMethod, value, Expression.Constant(typeCode)), property.PropertyType); + } + else + { + convertExpression = Expression.Convert(value, property.PropertyType); + } + var setterCall = Expression.Call(target, method, convertExpression); var expr = Expression.Lambda>(setterCall, instance, value); return expr.Compile(); } diff --git a/ZeroLevel/obj/Debug/ZeroLevel.csproj.CoreCompileInputs.cache b/ZeroLevel/obj/Debug/ZeroLevel.csproj.CoreCompileInputs.cache index 431e5cf..1a69533 100644 --- a/ZeroLevel/obj/Debug/ZeroLevel.csproj.CoreCompileInputs.cache +++ b/ZeroLevel/obj/Debug/ZeroLevel.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -4d221d21073e6ec70fc75d0c6e7d2458aa0f2b9a +23b05e1da25edde99ed56a899f894605a2243d39