将 int 转换为 char 的最快方法是什么
What is the fastest way to convert int to char
将 int 转换为 char 的最快方法是什么?
我需要一种更快的方法,因为
convertingchar = Convert.ToChar(intvalue);
是我在节目中最慢的部分。
我有多个不同的 int 值,必须将其转换为 char。
我的项目很大,我无法 post 我的功能。这就是为什么我 post 这个测试函数。
到目前为止我的代码。
char convertingchar = ' ';
...some code...
public void convert(int intvalue){
convertingchar = Convert.ToChar(intvalue);
}
Convert.ToChar
最终执行显式转换为 (char)value
,其中值是您的 int
值。在这样做之前,它会检查以确保值在 0 to 0xffff
范围内,如果不在范围内则抛出 OverflowException
。额外的方法调用、value/boundary 检查和 OverflowException
可能有用,但如果没有,如果只使用 (char)value
.
性能会更好
这将确保转换时一切正常,但需要一些时间来确保这一点,
convertingchar = Convert.ToChar(intvalue);
这将在不确保一切正常的情况下转换它,所以时间更少,
convertingchar = (char)intvalue;
例如
Console.WriteLine("(char)122 is {0}", (char)122);
产量:
(char)122 is z
注意
与问题没有直接关系,但如果您觉得转换速度很慢,那么您可能做错了什么。问题是为什么需要把int
的地段转成char
。你想要达到的目标。可能有更好的方法。
运行 quick performance test 在你的 Convert.ToChar
方法和提到的铸造方法之间,我发现 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
执行的内容。
与其他人指出的相反,最快的方法是根本不 运行 任何代码。在所有其他情况下,为 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
将 int 转换为 char 的最快方法是什么? 我需要一种更快的方法,因为
convertingchar = Convert.ToChar(intvalue);
是我在节目中最慢的部分。 我有多个不同的 int 值,必须将其转换为 char。 我的项目很大,我无法 post 我的功能。这就是为什么我 post 这个测试函数。
到目前为止我的代码。
char convertingchar = ' ';
...some code...
public void convert(int intvalue){
convertingchar = Convert.ToChar(intvalue);
}
Convert.ToChar
最终执行显式转换为 (char)value
,其中值是您的 int
值。在这样做之前,它会检查以确保值在 0 to 0xffff
范围内,如果不在范围内则抛出 OverflowException
。额外的方法调用、value/boundary 检查和 OverflowException
可能有用,但如果没有,如果只使用 (char)value
.
这将确保转换时一切正常,但需要一些时间来确保这一点,
convertingchar = Convert.ToChar(intvalue);
这将在不确保一切正常的情况下转换它,所以时间更少,
convertingchar = (char)intvalue;
例如
Console.WriteLine("(char)122 is {0}", (char)122);
产量:
(char)122 is z
注意
与问题没有直接关系,但如果您觉得转换速度很慢,那么您可能做错了什么。问题是为什么需要把int
的地段转成char
。你想要达到的目标。可能有更好的方法。
运行 quick performance test 在你的 Convert.ToChar
方法和提到的铸造方法之间,我发现 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
执行的内容。
与其他人指出的相反,最快的方法是根本不 运行 任何代码。在所有其他情况下,为 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