Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C语言中优化HTML标记移除_C#_Optimization - Fatal编程技术网

C# 在C语言中优化HTML标记移除

C# 在C语言中优化HTML标记移除,c#,optimization,C#,Optimization,我有一些代码可以从文本中删除HTML标记。我不关心内容脚本、css、文本等,重要的是,至少现在,标签本身被剥离了 这可能正在进入微优化领域,但该代码属于少数功能之一,这些功能将经常针对大量数据运行,因此从整个应用程序的角度来看,任何百分比的节省都可能转化为有用的节省 目前的代码如下所示: public static string StripTags(string html) { var currentIndex = 0; var insideTag = false; va

我有一些代码可以从文本中删除HTML标记。我不关心内容脚本、css、文本等,重要的是,至少现在,标签本身被剥离了

这可能正在进入微优化领域,但该代码属于少数功能之一,这些功能将经常针对大量数据运行,因此从整个应用程序的角度来看,任何百分比的节省都可能转化为有用的节省

目前的代码如下所示:

public static string StripTags(string html)
{
    var currentIndex = 0;
    var insideTag = false;
    var output = new char[html.Length];

    for (int i = 0; i < html.Length; i++)
    {
        var c = html[i];
        if (c == '>')
        {
            insideTag = false;
            continue;
        }
        if (!insideTag)
        {
            if (c == '<')
            {
                insideTag = true;
                continue;
            }
            output[currentIndex] = c;
            currentIndex++;
        }
    }
    return new string(output, 0, currentIndex);
}
有没有什么明显的.net技巧让我错过了?有关信息,请使用.NET4

非常感谢。

谷歌搜索会产生许多关于使用正则表达式的链接,这些链接与以下内容类似:

public string Strip(string text)
{
    return Regex.Replace(text, @”<(.|\n)*?>”, string.Empty);
}
谷歌搜索会产生许多关于使用正则表达式的链接,这些链接与以下内容类似:

public string Strip(string text)
{
    return Regex.Replace(text, @”<(.|\n)*?>”, string.Empty);
}

在这段代码中,您可以一个接一个地复制字符。通过只检查html内部或外部当前部分的结束位置,然后使用一次性移动整个块,您可能可以大大加快速度,这将支持较低级别的优化。例如,在64位上,它可以在一个处理器周期内复制4个unicode字符4*2*8位。标签之间的文本位可能相当大,因此这可能会增加

另外,stringbuilder文档在某些地方提到,因为它是在框架中实现的,而不是在C中实现的,所以它的性能在托管C中是无法复制的。不确定如何添加块,您可能会对此进行研究


关于Gert Jan

在本代码中,您可以逐个复制字符。通过只检查html内部或外部当前部分的结束位置,然后使用一次性移动整个块,您可能可以大大加快速度,这将支持较低级别的优化。例如,在64位上,它可以在一个处理器周期内复制4个unicode字符4*2*8位。标签之间的文本位可能相当大,因此这可能会增加

另外,stringbuilder文档在某些地方提到,因为它是在框架中实现的,而不是在C中实现的,所以它的性能在托管C中是无法复制的。不确定如何添加块,您可能会对此进行研究


关于Gert Jan,您应该查看以下库,因为它似乎是与.NET中的html文件交互的最佳方式:

您应该查看以下库,因为它似乎是与.NET中的html文件交互的最佳方式:

您还可以对其进行编码:

string encodedString = Server.HtmlEncode(stringToEncode);

看看这里:

您还可以对其进行编码:

string encodedString = Server.HtmlEncode(stringToEncode);

看看这里:

不要解决不存在的问题

此方法将被调用多少次?许多的有多少几千?不足以保证优化

你能不能做一个平行的,根据机器的不同,把速度提高3-5倍?可能吧

您的代码是否依赖于许多其他代码?当然可以

您是否可能有以下情况:

// Some slow code
StripTags(s); // Super fast version
// Some more slow code here
那么你的标签有多快会有关系吗

你是从档案里得到的吗?你是从网络上得到的吗?很少有瓶颈是您的原始CPU能力

让我再说一遍:


不要解决不存在的问题

不要解决不存在的问题

此方法将被调用多少次?许多的有多少几千?不足以保证优化

你能不能做一个平行的,根据机器的不同,把速度提高3-5倍?可能吧

您的代码是否依赖于许多其他代码?当然可以

您是否可能有以下情况:

// Some slow code
StripTags(s); // Super fast version
// Some more slow code here
那么你的标签有多快会有关系吗

你是从档案里得到的吗?你是从网络上得到的吗?很少有瓶颈是您的原始CPU能力

让我再说一遍:


不要解决不存在的问题

然而,正则表达式不是用来解析html的,正则表达式的速度会慢得多。对它进行基准测试,您会非常清楚地看到原始解决方案会快得多。但是,正则表达式不是用来解析html的。正则表达式会慢得多。对其进行基准测试,您将非常清楚地看到原始解决方案将更快。原始海报只想去除HTML标记。他不需要以任何复杂的方式操纵HTML。HTML敏捷包将为他不需要做的事情增加大量开销。那么AgilityPack中的HtmlText类呢?我认为它是用来删除标签的。马丁-谢谢,如果我正在看更聪明的标签操作,我肯定会考虑AgItPyPACK。不过,在这种情况下,我只是在寻找速度优化。原始海报只是想去掉HTML标签。他不需要以任何复杂的方式操纵HTML。HTML敏捷包将为他不需要做的事情增加大量开销。那么AgilityPack中的HtmlText类呢?我想它是由t
删除标签。马丁-谢谢,如果我正在看更聪明的标签操作,我肯定会考虑AgItPyPACK。不过,在这种情况下,我只是在寻找速度优化。谢谢你,这是一个非常明智的建议,我将有一个发挥,并将更新!你说得很对!修改后的算法在每个块上执行CopyTo的速度大约快了15%,这在函数的每个元素所需的时间方面是非常令人印象深刻的,足以产生影响。非常感谢。不客气,我喜欢微优化这类东西8-。另一个相对简单的优化是在一个任务线程上进行搜索,在第二个任务线程上进行复制。因为你没有改变读取数组。琴弦应该足够大,以保持它们分开,这样就不会有虚假的分享。谢谢你,这是一个非常明智的建议,我将有一个发挥,并将更新!你说得很对!修改后的算法在每个块上执行CopyTo的速度大约快了15%,这在函数的每个元素所需的时间方面是非常令人印象深刻的,足以产生影响。非常感谢。不客气,我喜欢微优化这类东西8-。另一个相对简单的优化是在一个任务线程上进行搜索,在第二个任务线程上进行复制。因为你没有改变读取数组。字符串应该足够大,以便将它们分开,这样就不会出现错误共享。@Dour High Arch-好问题-目前我让这些字符串消失,因为这与我正在解析的数据相符。如果代码经常运行,您可能只需分配一次大小合理的输出数组,就可以获得很大的加速;如果内存有问题,可以使用弱引用,并在可能的情况下使用弱引用。java中的一个非常类似的问题在that@Dour高拱门-好问题-目前我让它们消失,因为这符合我正在解析的数据。如果代码经常运行,您可能会通过只分配一次输出数组(显然大小合理)来获得很大的加速;如果内存有问题,可以使用弱引用,并在可能的情况下使用弱引用。java中的一个非常类似的问题得到了大约15%的加速,我感谢您的关注-因此我对微优化发表了自己的评论。作为回答,它将在一些HTML上每天运行数亿次,这些HTML可能会扩展到100KB。TBH我可以接受上述功能的性能,但与社区探讨替代方案很有趣。例如,@gjvdkamp提供了一个我不会考虑的答案…@Boris非常正确,大多数优化完全是浪费精力,因为人们选择了执行次数很少的东西。但是,当你在等待一个8路盒子来完成一些计算时,相信我,这些黑客会让一切变得不同!我感谢您的关注,因此我对微观优化提出了自己的看法。作为回答,它将在一些HTML上每天运行数亿次,这些HTML可能会扩展到100KB。TBH我可以接受上述功能的性能,但与社区探讨替代方案很有趣。例如,@gjvdkamp提供了一个我不会考虑的答案…@Boris非常正确,大多数优化完全是浪费精力,因为人们选择了执行次数很少的东西。但是,当你在等待一个8路盒子来完成一些计算时,相信我,这些黑客会让一切变得不同!