我正在将小的(2-10 KB)XML文档作为WCF服务的输入。现在我有两个选项可以从传入的XML读取数据值
哪种方法更快?一些统计数据来支持你的答案将是很好的。
发布于 2008-11-20 23:16:15
我会把它反序列化。
如果使用xpath,将反序列化(或“加载”)到XmlDocument或其他地方。因此,这两种解决方案都使用时间反序列化。在完成之后,xpath将变得更慢,因为解析该字符串、解析名称、执行函数等等都花费了时间。另外,如果使用xpath,则没有类型安全性。编译器无法为您检查xpath语法。
如果使用XmlSerializer和类,则会得到静态类型。对数据的访问非常快,如果您想使用xpath查询数据,仍然有一些方法可以做到这一点。
另外,我想说,您的代码在类中可能更容易理解。
唯一的缺点是xml必须始终遵循相同的模式,但在您的情况下,这可能不是真正的问题。
我希望你们原谅没有统计数据,我认为没有例子的论点是足够有力的。如果你想要一个最终的答案,试一试,并保持秒表准备。
发布于 2008-11-10 12:04:25
第三种选择是坚持使用XML,但是使用任何XML进行查询--例如LINQ -使得查询在代码中相对简单。
您是否已经将文本解析为XML文档?
您是否确信这实际上是代码中的一个重要性能瓶颈?(例如,如果你当时正在和一个数据库交谈,那就不用担心这件事了-先让它以最简单的方式工作吧)
查询总是相同的,还是在某种程度上是动态的?
你有一个带有真实信息和查询的测试平台吗?如果不是,您需要一个,以评估在这里给出的任何答案与您的数据。如果你这么做了,我希望你自己尝试它会相当容易:)
发布于 2016-06-06 19:27:28
这里有四个箱子,每次都在滴答作响:
4th)
)
示例对象被读取1000次。
你应该在乎吗?对于大多数情况,使用内置到.net中的默认序列化程序。没有必要偏离,这将产生最小数量的代码。这些应该是足够的,提供类型安全,并释放自己做更有意义的事情与你的时间。在某些情况下,如果希望从大型XML结构中选择某些数据元素,XElement可能很有用,但即使这样,也应该将这些元素放入强类型的DTO中。但请记住,所有的方法都是非常快的。我亲自在几毫秒内序列化了一个极其广泛和深入的对象模型(远远超过400个类)。对于较小和琐碎的对象,它将是子ms响应时间。XMLSerializer热身比其他的要慢,但是一个可以通过SGEN缓解或者在启动时进行一些初始化。
细节和密码..。
Xml序列化程序
[Serializable]
public class FoobarXml
{
public string Name { get; set; }
public int Age { get; set; }
public bool IsContent { get; set; }
[XmlElement(DataType = "date")]
public DateTime BirthDay { get; set; }
}
第一次: 2448965
1000读平均数: 245
IXmlSerializable
public class FoobarIXml : IXmlSerializable
{
public string Name { get; set; }
public int Age { get; set; }
public bool IsContent { get; set; }
public DateTime BirthDay { get; set; }
public XmlSchema GetSchema()
{
return null;
}
public void ReadXml(XmlReader reader)
{
reader.MoveToContent();
var isEmptyElement = reader.IsEmptyElement;
reader.ReadStartElement();
if (!isEmptyElement)
{
Name = reader.ReadElementString("Name");
int intResult;
var success = int.TryParse(reader.ReadElementString("Age"), out intResult);
if (success)
{
Age = intResult;
}
bool boolResult;
success = bool.TryParse(reader.ReadElementString("IsContent"), out boolResult);
if (success)
{
IsContent = boolResult;
}
DateTime dateTimeResult;
success = DateTime.TryParseExact(reader.ReadElementString("BirthDay"), "yyyy-MM-dd", null,
DateTimeStyles.None, out dateTimeResult);
if (success)
{
BirthDay = dateTimeResult;
}
reader.ReadEndElement(); //Must Do
}
}
public void WriteXml(XmlWriter writer)
{
writer.WriteElementString("Name", Name);
writer.WriteElementString("Age", Age.ToString());
writer.WriteElementString("IsContent", IsContent.ToString());
writer.WriteElementString("BirthDay", BirthDay.ToString("yyyy-MM-dd"));
}
}
}
第一次: 2051813
1000读平均数: 208
手轧
public class FoobarHandRolled
{
public FoobarHandRolled(string name, int age, bool isContent, DateTime birthDay)
{
Name = name;
Age = age;
IsContent = isContent;
BirthDay = birthDay;
}
public FoobarHandRolled(string xml)
{
if (string.IsNullOrWhiteSpace(xml))
{
return;
}
SetName(xml);
SetAge(xml);
SetIsContent(xml);
SetBirthday(xml);
}
public string Name { get; set; }
public int Age { get; set; }
public bool IsContent { get; set; }
public DateTime BirthDay { get; set; }
/// <summary>
/// Takes this object and creates an XML representation.
/// </summary>
/// <returns>An XML string that represents this object.</returns>
public override string ToString()
{
var builder = new StringBuilder();
builder.Append("<FoobarHandRolled>");
if (!string.IsNullOrWhiteSpace(Name))
{
builder.Append("<Name>" + Name + "</Name>");
}
builder.Append("<Age>" + Age + "</Age>");
builder.Append("<IsContent>" + IsContent + "</IsContent>");
builder.Append("<BirthDay>" + BirthDay.ToString("yyyy-MM-dd") + "</BirthDay>");
builder.Append("</FoobarHandRolled>");
return builder.ToString();
}
private void SetName(string xml)
{
Name = GetSubString(xml, "<Name>", "</Name>");
}
private void SetAge(string xml)
{
var ageString = GetSubString(xml, "<Age>", "</Age>");
int result;
var success = int.TryParse(ageString, out result);
if (success)
{
Age = result;
}
}
private void SetIsContent(string xml)
{
var isContentString = GetSubString(xml, "<IsContent>", "</IsContent>");
bool result;
var success = bool.TryParse(isContentString, out result);
if (success)
{
IsContent = result;
}
}
private void SetBirthday(string xml)
{
var dateString = GetSubString(xml, "<BirthDay>", "</BirthDay>");
DateTime result;
var success = DateTime.TryParseExact(dateString, "yyyy-MM-dd", null, DateTimeStyles.None, out result);
if (success)
{
BirthDay = result;
}
}
private string GetSubString(string xml, string startTag, string endTag)
{
var startIndex = xml.IndexOf(startTag, StringComparison.Ordinal);
if (startIndex < 0)
{
return null;
}
startIndex = startIndex + startTag.Length;
var endIndex = xml.IndexOf(endTag, StringComparison.Ordinal);
if (endIndex < 0)
{
return null;
}
return xml.Substring(startIndex, endIndex - startIndex);
}
}
第一次: 161105
1000读平均数: 29
XElement
var xDoc = XElement.Parse(xml);
var nameElement = xDoc.Element("Name");
var ageElement = xDoc.Element("Age");
var isContentElement = xDoc.Element("IsContent");
var birthDayElement = xDoc.Element("BirthDay");
string name = null;
if (nameElement != null)
{
name = nameElement.Value;
}
var age = 0;
if (ageElement != null)
{
age = int.Parse(ageElement.Value);
}
var isContent = false;
if (isContentElement != null)
{
isContent = bool.Parse(isContentElement.Value);
}
var birthDay = new DateTime();
if (birthDayElement != null)
{
birthDay = DateTime.ParseExact(birthDayElement.Value, "yyyy-MM-dd", CultureInfo.InvariantCulture);
}
第一次: 247024
1000读平均数: 113
https://stackoverflow.com/questions/277710
复制相似问题