How long time should a wcf call from Compact framework on windows mobile take?
I call a wcf service method with a int parameter, and it returns an order object like below. It takes about 1,5 second to return the object is this normal or is it too slow for WCF? The Object has 1 Order, 2 OrderLines, and 1 OrderLineModifier.
[DataContract]
[KnownType(typeof(OrderLine))]
public class OrderDTO
{
public OrderDTO()
{
this.OrderLines= new OrderLineDtos();
}
[DataMember]
public ObjectState State { get; set; }
[DataMember]
public int Id { get; set; }
[DataMember]
public int? TableId { get; set; }
[DataMember]
public byte OrderStateId { get; set; }
[DataMember]
public byte OrderTypeId { get; set; }
[DataMember]
public string OrderCounter { get; set; }
[DataMember]
public DateTime OrderDateTime { get; set; }
[DataMember]
public DateTime LastStateDateTime { get; set; }
[DataMember]
public int? SalesPersonId { get; set; }
[DataMember]
public int MachineId { get; set; }
[DataMember]
public string Comments { get; set; }
[DataMember]
public decimal Value { get; set; }
[DataMember]
public decimal VatValue { get; set; }
[DataMember]
public string OrderIdentifier { get; set; }
[DataMember]
public int? CustomerId { get; set; }
[DataMember]
public byte[] Timestamp { get; set; }
[DataMember]
public bool IsPrinted { get; set; }
[DataMember]
public int? WorkShiftId { get; set; }
[DataMember]
public decimal TotalValue { get; set; }
[DataMember]
public int? EmployeeId { get; set; }
[DataMember]
public OrderLineDtos OrderLines { get; set; }
}
[CollectionDataContract]
public class OrderLineDtos : List<OrderLineDTO>
{
}
[DataContract]
[KnownType(typeof(OrderLineModifier))]
public class OrderLineDTO
{
public OrderLineDTO()
{
this.OrderLineModifiers = new List<OrderLineModifierDTO>();
}
[DataMember]
public ObjectState State { get; set; }
[DataMember]
public int Id { get; set; }
[DataMember]
public int OrderId { get; set; }
[DataMember]
public byte OrderLineStateId { get; set; }
[DataMember]
public System.DateTime LastStateDateTime { get; set; }
[DataMember]
public int ProductId { get; set; }
[DataMember]
public string ProductCode { get; set; }
[DataMember]
public string ProductName { get; set; }
[DataMember]
public decimal Quantity { get; set; }
[DataMember]
public decimal UnitPrice { get; set; }
[DataMember]
public decimal UnitPriceWithVatValue { get; set; }
[DataMember]
public decimal VatRate { get; set; }
[DataMember]
public decimal DiscountValue { get; set; }
[DataMember]
public decimal VatValue { get; set; }
[DataMember]
public decimal DiscountPercent { get; set; }
[DataMember]
public decimal LineTotal { get; set; }
[DataMember]
public string Comments { get; set; }
[DataMember]
public byte[] Timestamp { get; set; }
[DataMem开发者_如何学运维ber]
public bool IsTreated { get; set; }
[DataMember]
public short? VatRateId { get; set; }
[DataMember]
public List<OrderLineModifierDTO> OrderLineModifiers { get; set; }
}
[DataContract]
public partial class OrderLineModifierDTO
{
[DataMember]
public ObjectState State { get; set; }
[DataMember]
public int Id { get; set; }
[DataMember]
public int OrderLineId { get; set; }
[DataMember]
public int MenuItemOptionId { get; set; }
[DataMember]
public decimal Quantity { get; set; }
[DataMember]
public decimal UnitPrice { get; set; }
[DataMember]
public int MesureUnitId { get; set; }
[DataMember]
public string Comments { get; set; }
}
Thank you!
1.5 seconds could be just right (you are discussing possibly large data transmission to a mobile device) or it could be very slow. What you need to do is start narrowing down the speed "issue" to see if it is an issue. Figure out how much data is being transmitted to see if it is just a transfer time thing (slow network, etc.) Figure out if it is much more performant connecting from a desktop app (which would put it on the transmission or client-side processing). Figure out if most of the time is taken by the server. If the latter is true, profile your code to figure out if there is a bottleneck somewhere.
We can't tell you if this is good performance or not because we only have one of a thousand variables. Here are the things, in general, that would make its timing normal:
- Large data transfer
- Long processing time (lots of work to do on the server)
- Client processing time (lots of work to do once it arrives)
Here are the things that could be slowing down this service:
- Slow Database
- Network latency or bottlenecks
- Client memory issues
- Unoptimized server code
- Unknown delays somewhere in the process (waiting on another service, etc.)
You will need to do a full investigation to figure out what 1.5 seconds really means. You may find that this is a great time or you may find that you can do it in a lot less.
The time is composed from:
- Connecting from source (CF) to target (Server)
- Transforming objects to pure data (propably XML)
- Sending data through internet connection from source to target
- Transforming pure data to objects (C#)
- Processing method on server
- Tranforming objects to pure data (on server)
- Sending data through internet connection from target to source
- Transforming pure data to objects (on CF)
- So any of the step can take long time.
From my experience, the WCF is pretty fast. I recommend some profiling to find what is the bottleneck in your case.
One thing you can do to narrow your performance bottleneck down is to see how long it takes to call the service from the machine the service is running on. If it takes .25 seconds then you know you have 1.25 seconds of transmission time/client processing time. If it takes 1.45 seconds then you can say "ok 500 miliseconds over the network is pretty fast."
精彩评论