我是用indexof判断的 太慢
后来用正则判断 更慢
现在平均每秒150个
速度要提升到每秒10000个左右才可以
(前几天提问了个过滤号码问题 解决了 )
后来用正则判断 更慢
现在平均每秒150个
速度要提升到每秒10000个左右才可以
(前几天提问了个过滤号码问题 解决了 )
解决方案 »
- 类型为“System.DateTime”的表达式不能用于返回类型“System.Object”
- 一个非常绕的问题,字符串拼接,和截取
- 请问在winform开发中怎样实现窗体之间的跳转,在线等。
- Could not compile the mapping document异常问题
- 提示上下文中不存在名称“” 该怎么修改......
- 关于如何赋空值?
- 请问如何判断sql数据库中一个字段的值是否为空,并且填充它
- 怎样利用存储过程读取指定的记录呢
- 急急急!在线等待!!!winForm中DataGrid显示的问题?
- 我想在.net的Form1窗口中嵌入Word控件,并在其中编辑某Word文档?能实现吗?
- c#2.0 Type.GetType()问题,急啊,请高手帮忙
- C#中文件的同步异步读写有什么不同?
同意
string[] bwords = BadWords.Split('#');
int i,j;
string str;
StringBuilder sb = new StringBuilder();
for(i = 0; i< bwords.Length; i++)
{
str=bwords[i].ToString().Trim();
string regStr,toStr;
regStr=str;
Regex r=new Regex(regStr,RegexOptions.IgnoreCase | RegexOptions.Singleline| RegexOptions.Multiline);
Match m=r.Match(chkStr);
if(m.Success)
{
isOK = true;
}
sb.Remove(0,sb.Length);
}
return isOK;
http://community.csdn.net/Expert/topic/5383/5383234.xml?temp=.8008997对效率要求较高,把最后两行替换为
string sOut = Regex.Replace(sIn, pattern.ToString() , "", RegexOptions.Compiled);
static Regex[] _Regs;
并且初始化
for(i = 0; i< bwords.Length; i++){
Regex r=new Regex(regStr,RegexOptions.IgnoreCase | RegexOptions.Singleline| RegexOptions.Compiled);
}调用时
foreach(Regex reg in _Regs){
//在这儿工作,不用再实例化150个或1000个Regex
}
对foreach 试试
自己测试了一下
如果只是要简单的过滤指定的词
还是string.replace最快;using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;namespace RASTest
{
class Program
{
static void Main(string[] args)
{
DateTime start;
int regLength = 2000;
int strLength = 1000; ReplaceString3 rs3 = ReplaceString3.Instance(regLength);
string str3 = CreateString(strLength);
start = DateTime.Now;
str3 = rs3.Replace(str3);
Console.WriteLine(((TimeSpan)(DateTime.Now - start)).ToString());
ReplaceString rs=ReplaceString.Instance(regLength);
string str1 = CreateString(strLength);
start = DateTime.Now;
str1 = rs.Replace(str1);
Console.WriteLine(((TimeSpan)(DateTime.Now - start)).ToString()); ReplaceString2 rs2 = ReplaceString2.Instance(regLength);
string str2 = CreateString(strLength);
start = DateTime.Now;
str2 = rs2.Replace(str2);
Console.WriteLine(((TimeSpan)(DateTime.Now - start)).ToString());
Console.Read();
}
public static string CreateString(int length){
StringBuilder sb = new StringBuilder();
for (int i = 0; i < length; i++) {
sb.AppendFormat("\n{0}\n", i);
}
return sb.ToString();
}
}
public class ReplaceString {
private static ReplaceString _Instance;
private Regex[] _Regs;
private ReplaceString(int length){
_Regs = new Regex[length];
for (int i = 0; i < _Regs.Length; i++) {
string pattern =String.Format(@"\n{0}\n",i.ToString());
_Regs[i] = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled);
}
_Instance = this;
} public static ReplaceString Instance(int length)
{
if (_Instance == null)
{
_Instance = new ReplaceString(length);
}
return _Instance;
} public string Replace(string str) {
foreach (Regex reg in _Regs) {
str = reg.Replace(str, "\n...\n");
}
return str;
}
} public class ReplaceString2{
private static ReplaceString2 _Instance;
private Regex _Reg;
private ReplaceString2(int length){
StringBuilder sb = new StringBuilder();
for (int i = 0; i <length; i++) {
sb.AppendFormat(@"\n{0}\n|",i.ToString());
}
string pattern = sb.ToString(0, sb.Length - 1);
_Reg = new Regex(pattern,RegexOptions.IgnoreCase|RegexOptions.Compiled);
_Instance = this;
} public static ReplaceString2 Instance(int length)
{
if (_Instance == null)
{
_Instance = new ReplaceString2(length);
}
return _Instance;
} public string Replace(string str) {
return _Reg.Replace(str, "\n...\n");
}
} public class ReplaceString3 {
private static ReplaceString3 _Instance;
private string[] _Word;
private ReplaceString3(int length) {
_Word = new string[length];
for (int i = 0; i < length; i++) {
_Word[i] = String.Format("\n{0}\n",i);
}
_Instance = this;
} public static ReplaceString3 Instance(int length) {
if (_Instance == null) {
_Instance = new ReplaceString3(length);
}
return _Instance;
} public string Replace(string str) {
foreach (string patt in _Word) {
str = str.Replace(patt, "\n...\n");
}
return str;
}
}
}
====运行结果
00:00:00.1562500
00:00:06.7968750
00:00:14.7343750
都是string.replace表现最优
当然这也许和样本复杂度有关
但是我推荐直接使用string.replace
Split:00:00:00.0200288
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;namespace WindowsApplication29
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public static string CreateString(int length)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < length; i++)
{
sb.AppendFormat("\n{0}\n", i);
}
return sb.ToString();
} private void button1_Click(object sender, EventArgs e)
{
DateTime start;
start = DateTime.Now; int regcount = 5000;
int strLength = 1000; string[] _Word;
_Word = new string[regcount];
for (int i = 0; i < regcount; i++)
{
_Word[i] = String.Format("\n{0}\n", i);
} string buff = CreateString(strLength);
foreach (string patt in _Word)
{
buff = buff.Replace(patt, "\n...\n");
}
textBox1.Text="Replace:"+((TimeSpan)(DateTime.Now - start)).ToString();
} private void button2_Click(object sender, EventArgs e)
{
DateTime start;
start = DateTime.Now; int regcount = 5000;
int strLength = 1000; string[] _Word;
_Word = new string[regcount];
for (int i = 0; i < regcount; i++)
{
_Word[i] = String.Format("\n{0}\n", i);
} string buff = CreateString(strLength); /*
foreach (string patt in _Word)
{
buff = buff.Replace(patt, "\n...\n");
}
*/
string[] _data = buff.Split(_Word, StringSplitOptions.None);
StringBuilder sb = new StringBuilder(); if (_data.Length > 0)
sb.Append(_data[0]);
for (int i = 1; i < _data.Length; i++)
{
sb.Append("\n...\n");
sb.Append(_data[i]);
} buff = sb.ToString(); textBox2.Text = "Split:" + ((TimeSpan)(DateTime.Now - start)).ToString();
}
}
}
regcount <2000 两者 查不多
strLength 也有关
_data.Length-1 就是 替换了 多少处
例子:(盗用了楼上的split方法)
public bool Replace(ref string str) {
string returns = str; string[] _data = str.Split(_Word, StringSplitOptions.None);
StringBuilder sb = new StringBuilder(); if (_data.Length > 0)
sb.Append(_data[0]);
for (int i = 1; i < _data.Length; i++)
{
sb.Append("\n...\n");
sb.Append(_data[i]);
} str = sb.ToString(); return returns != str;
}
这样 不好 如果 是 长字符串 并且在 尾部 替换 同长度的 字符串 就耗资源
我有 鸡蛋里挑骨头的 的习惯
多多 包含
过滤池里有2000个短语(2-6个字的短语) 过滤效率是每秒1400多个 速度太慢
private void button1_Click(object sender, System.EventArgs e)
{
DateTime startTime = DateTime.Now;
int j = 0;
foreach(string s in al2)
{
if(s!=null)
{
if(this.isContentOKm(s))
{
j++;
}
}
} DateTime endTime = DateTime.Now;
System.TimeSpan ts = endTime - startTime;
label1.Text = al2.Count+"个短句里包含"+j+"个非法词语\r\n";
label1.Text += "程序运行时间"+ts.ToString();
}
private bool isContentOKm(string strContent)
{
bool isOK = false;
if (strContent != null)
{
for(int i=0;i<al.Count;i++)
{
string s = strContent.Replace(al[i].ToString(),"");
if(s.Length<strContent.Length)
{
isOK = true;
break;
}
}
}
return isOK;
}
简单的办法,把string分成10段,开10个线程,每个线程同时进行。
简单的办法,把string分成10段,开10个线程,每个线程同时进行。
简单的办法,把string分成10段,开10个线程,每个线程同时进行。
简单的办法,把string分成10段,开10个线程,每个线程同时进行。
简单的办法,把string分成10段,开10个线程,每个线程同时进行。
简单的办法,把string分成10段,开10个线程,每个线程同时进行。
简单的办法,把string分成10段,开10个线程,每个线程同时进行。
简单的办法,把string分成10段,开10个线程,每个线程同时进行。
简单的办法,把string分成10段,开10个线程,每个线程同时进行。
简单的办法,把string分成10段,开10个线程,每个线程同时进行。
简单的办法,把string分成10段,开10个线程,每个线程同时进行。
简单的办法,把string分成10段,开10个线程,每个线程同时进行。
简单的办法,把string分成10段,开10个线程,每个线程同时进行。
简单的办法,把string分成10段,开10个线程,每个线程同时进行。
简单的办法,把string分成10段,开10个线程,每个线程同时进行。
简单的办法,把string分成10段,开10个线程,每个线程同时进行。
可以去掉
StringBuilder sb = new StringBuilder(); if (_data.Length > 0)
sb.Append(_data[0]);
for (int i = 1; i < _data.Length; i++)
{
sb.Append("\n...\n");
sb.Append(_data[i]);
} buff = sb.ToString();
而且 string分成10段 还要 考虑 有没有 那个短语 会被 分在两段 中 造成 误判。
for(int i=0;i<Text.Length;i++)
{
如果Text[i]在短语库有短语的第一个字符与之相同 (按照索引快速查找)
{
判断Text在i出是否与短语库中的短语相同;
如果相同 则找到了一个
}
}
//首先从数据库中或其他的什么媒体上读取所有的单词(短语)
//将这些单词按字母顺序排序 ->Words
//建立索引 int [,]Indexs = new int[26,2];
//将排好序的单词序列 26字母中每个字母出现在序列中的第一个位置和最后一个位置记录到Indexs相应的位置处
//循环Text
// 根据Text[i]的值定位Indexs的位置x,在Words[Indexs[x,0]]到Words[Indexs[x,1]]范围内看是否能找到Text[i]处的单词