【问题标题】:What is the fastest way to convert int to char将int转换为char的最快方法是什么
【发布时间】:2015-05-15 18:27:50
【问题描述】:

将 int 转换为 char 的最快方法是什么? 我需要一种更快的方法,因为,

convertingchar = Convert.ToChar(intvalue);

是我在程序中最慢的部分。 我有多个不同的 int 值,必须转换为 char。 我的项目很大,我不能发布我的功能。这就是我发布此测试功能的原因。

到目前为止我的代码。

char convertingchar = ' ';
...some code...
public void convert(int intvalue){
   convertingchar = Convert.ToChar(intvalue);
}

【问题讨论】:

  • 你是如何分析它的?
  • Convert.ToChar 最终以(char)value 执行显式转换,其中value 是您的int 值。在这样做之前,它会检查以确保value0 to 0xffff 范围内,如果不在则抛出OverflowException。额外的方法调用、值/边界检查和OverflowException 可能有用,但如果没有,如果只使用(char)value,性能会更好。
  • 我认为我需要比这更快的方法,因为在 Visual Studio 中进行性能测试之后,这是我最慢的部分。请记住,这是一个测试功能。我只是想也许有一种更快的转换方法。
  • @Cyber​​Dude 记住这是我真实项目中的一个测试函数,这个函数更复杂我只是想提取我的问题
  • 如果这是您的程序中最耗时的部分,您可能希望找到一种不单独转换每个字符或避免需要进行如此多转换的方法

标签: c# performance char int converter


【解决方案1】:

Convert.ToChar 最终以(char)value 执行显式转换,其中 value 是您的 int 值。在这样做之前,它会检查以确保值在0 to 0xffff 范围内,如果不在则抛出OverflowException。额外的方法调用、值/边界检查和OverflowException 可能有用,但如果没有,如果只使用(char)value,性能会更好。

这将确保在转换时一切正常,但在确保这一点时需要一些时间,

convertingchar = Convert.ToChar(intvalue);

这将在不确保一切正常的情况下进行转换,从而缩短时间,

convertingchar = (char)intvalue;

例如。

 Console.WriteLine("(char)122 is {0}", (char)122);

产量:

(char)122 是 z


注意

与问题没有直接关系,但如果您觉得转换速度很慢,那么您可能做错了。问题是为什么您需要将大量的int 转换为char。你想要达到的目标。可能有更好的方法。

【讨论】:

  • 我正在使用你的代码,它工作得很好,比我的旧解决方案更快
  • (char)value 不做范围检查吗?
【解决方案2】:

在您的 Convert.ToChar 方法和提到的铸造方法之间运行 quick performance test,我发现 65535 测试 (char.MaxValue):

Convert: 00:00:00.0005447 total
Cast:    00:00:00.0003663 total

在最好的情况下,演员在转换的大约一半时间内为我运行。

Reference Source 中的 Convert.ToChar 的实现揭示了时间消费者:

public static char ToChar(int value) {
    if (value < 0 || value > Char.MaxValue) throw new OverflowException(Environment.GetResourceString("Overflow_Char"));
    Contract.EndContractBlock();
    return (char)value;
}

虽然这些检查确实是有目的的,但您的特定用例,尤其是在这种性能关键的情况下,可能不需要它们。这取决于你。

执行这些检查的一个不错的替代方法是使用ushort 而不是int。显然,这可能会也可能不会实现,但在最大值相同的情况下,这意味着您将在编译时检查您之前依赖 ToChar 执行的操作。

【讨论】:

  • 这里不能低估ushort 的使用——它会使任何边界检查变得无关紧要,从而提高速度和准确性。
  • @Trenin - 虽然您说的是真的,但您为使用ushort 而不是int 提供功能所做的任何努力,最好通过创建char 而不是intushort,然后不完全调用 char ToChar(char) 函数....换句话说,要么他有整数并且无法更改它,要么他可以更改它,然后应该更改为char,不是ushort
【解决方案3】:

与其他人所指出的相反,最快的方法是根本不运行任何代码。在所有其他情况下,为int 分配了内存,为char 分配了内存。因此,可以实现的最佳效果是将int 复制到char 地址。

但是,由于根本不运行任何代码,因此这段代码要快 100%。

[StructLayout(LayoutKind.Explicit)]
public struct Foo
{
    [FieldOffset(0)] 
    public int Integer;
    [FieldOffset(0)] 
    public char Char;
}

https://msdn.microsoft.com/en-us/library/aa288471%28v=vs.71%29.aspx

【讨论】:

  • 虽然您需要运行代码来将值移入和移出这些字段。
  • 你现在如何转换?
  • 将一个整数移动到 Integer 字段中,然后从 Char 字段中抓取字符。
  • @LasseVKarlsen 是的,您需要让代码将值移动到整数中。在这种情况下,您将一无所获。但是如果将字段集成到读取或写入值的对象中,则可以跳过单个副本...
  • 您的代码不可移植,因为它的效果取决于字节顺序(除非 C# 以某种方式统一了它,这至少不太可能),并且对优化性能没有任何影响(除非优化真的很糟糕)。
猜你喜欢
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多