优化foreach遍历执行速度

冬王 2017-08-03 09:33:25
foreach (var line in path)
{

if (line.IndexOf("https") != -1)
{
string a = line.Substring(8, line.Replace("://", "").IndexOf("/") - 5);//截取获取网站域名
doma = a;
}
else if (line.IndexOf("http") != -1)
{
string a = line.Substring(7, line.Replace("://", "").IndexOf("/") - 4);//截取获取网站域名
doma = a;
}
else if (line.IndexOf("http") == -1 && line.IndexOf("https") == -1 && line.IndexOf("com") != -1)
{
string a = line.Substring(0, line.IndexOf("com") + 3);//截取获取网站域名
doma = a;
}
else
{
string a = line.Substring(0, line.IndexOf("cn") + 2);//截取获取网站域名
doma = a;
}
if (line.IndexOf(".") == -1)
{
doma = line;
}
try
{
//Ping 实例对象;
Ping pingSender = new Ping();
//ping选项;
PingOptions options = new PingOptions();
options.DontFragment = true;
string data = "ping test data";
byte[] buf = Encoding.ASCII.GetBytes(data);
//调用同步send方法发送数据,结果存入reply对象;
PingReply reply = pingSender.Send(doma, 120, buf, options);
DateTime.Now.ToString();

if (reply.Status == IPStatus.Success)
{
String title = GetWebClient(line);//获取网站的title
//XML格式保存文本

String www = "<wz>\r\n <url>" + doma + "</url>\r\n <tiem>" + DateTime.Now.ToString() + "</tiem>\r\n<ifopen>" + CheckUrlVisit(line) + "</ifopen> <title>" + title + "</title>\r\n<ip>" + reply.Address + "</ip>\r\n<ftiem>" + reply.RoundtripTime + "</ftiem>\r\n<stiem>" + reply.Options.Ttl + "</stiem>\r\n<buffer>" + reply.Buffer.Length + "</buffer>\r\n <date>" + reply.Options.DontFragment + "</date>\r\n</wz>\r\n ";
p += www;

}
else
{
p += "<wz>\r\n<url>" + doma + "</url>\r\n<tiem>" + DateTime.Now.ToString() + "</tiem>\r\n<ifopen>" + CheckUrlVisit(line) + "</ifopen>\r\n<title>获取失败!!!</title>\r\n<ip>获取失败!!!</ip>\r\n<ftiem>获取失败!!!</ftiem>\r\n<stiem>获取失败!!!</stiem>\r\n<buffer>获取失败!!!</buffer>\r\n<date>获取失败!!!</date>\r\n</wz>\r\n"; ;
}
}
catch
{
p += "<wz>\r\n<url>" + doma + "</url>\r\n<tiem>" + DateTime.Now.ToString() + "</tiem>\r\n<ifopen>" + CheckUrlVisit(line) + "</ifopen>\r\n<title>获取失败!!!</title>\r\n<ip>获取失败!!!</ip>\r\n<ftiem>获取失败!!!</ftiem>\r\n<stiem>获取失败!!!</stiem>\r\n<buffer>获取失败!!!</buffer>\r\n<date>获取失败!!!</date>\r\n</wz>\r\n"; ;
}
}
...全文
1090 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
冬王 2017-08-03
  • 打赏
  • 举报
回复
引用 1 楼 cyhh_h 的回复:
在catch中打印下时间,看下是否一直出现异常,导致执行效率变慢
不是,就是循环执行ping下面的代码 太慢了 怎么优化一下 执行快
勤奋的执着 2017-08-03
  • 打赏
  • 举报
回复
在catch中打印下时间,看下是否一直出现异常,导致执行效率变慢
赵4老师 2017-08-03
  • 打赏
  • 举报
回复
引用 13 楼 qq_39616892 的回复:
[quote=引用 11 楼 zhao4zhong1 的回复:] 记不得哪位C++大牛在哪本学习C++的书的前言里面说过 “用C语言1000行源码能完成的工作千万不要用C++重写!”
大哥 我把源码给你 你给我 改改呗。 我折腾了一天了。。[/quote] 多进程ping才是王道。 多线程那些都太Low!
赵4老师 2017-08-03
  • 打赏
  • 举报
回复
引用 12 楼 qq_39616892 的回复:
[quote=引用 10 楼 zhao4zhong1 的回复:] 4楼代码实现了多进程ping
不行不行 看不懂。。 [/quote] 现在的码农竟然99%都不会在cmd窗口中输入cd命令设置当前目录为程序所在目录,输入程序名运行程序了!
冬王 2017-08-03
  • 打赏
  • 举报
回复
引用 11 楼 zhao4zhong1 的回复:
记不得哪位C++大牛在哪本学习C++的书的前言里面说过 “用C语言1000行源码能完成的工作千万不要用C++重写!”
大哥 我把源码给你 你给我 改改呗。 我折腾了一天了。。
冬王 2017-08-03
  • 打赏
  • 举报
回复
引用 10 楼 zhao4zhong1 的回复:
4楼代码实现了多进程ping
不行不行 看不懂。。
赵4老师 2017-08-03
  • 打赏
  • 举报
回复
记不得哪位C++大牛在哪本学习C++的书的前言里面说过 “用C语言1000行源码能完成的工作千万不要用C++重写!”
赵4老师 2017-08-03
  • 打赏
  • 举报
回复
4楼代码实现了多进程ping
ztenv 2017-08-03
  • 打赏
  • 举报
回复
引用 8 楼 qq_39616892 的回复:
[quote=引用 7 楼 lianshaohua 的回复:] [quote=引用 6 楼 qq_39616892 的回复:] [quote=引用 3 楼 lianshaohua 的回复:] 多线程去ping吧,不是foreach的问题
我试过不行, 你在我代码上改改 我看看你怎么弄的。。[/quote] 把try...catch中的放到线程函数中去,然后每次遍历就创建一个线程,把线程放到一个容器中,最后在main退出之前等待所有的线程退出…………[/quote] Thread trd = new Thread(ping); trd.Start(); 我ping方法有两个参数, 怎么传过去 不然报错[/quote] 创建线程的时候传进去,线程的入口函数支持传参的,去看看创建线程的函数吧
冬王 2017-08-03
  • 打赏
  • 举报
回复
引用 7 楼 lianshaohua 的回复:
[quote=引用 6 楼 qq_39616892 的回复:] [quote=引用 3 楼 lianshaohua 的回复:] 多线程去ping吧,不是foreach的问题
我试过不行, 你在我代码上改改 我看看你怎么弄的。。[/quote] 把try...catch中的放到线程函数中去,然后每次遍历就创建一个线程,把线程放到一个容器中,最后在main退出之前等待所有的线程退出…………[/quote] Thread trd = new Thread(ping); trd.Start(); 我ping方法有两个参数, 怎么传过去 不然报错
ztenv 2017-08-03
  • 打赏
  • 举报
回复
引用 6 楼 qq_39616892 的回复:
[quote=引用 3 楼 lianshaohua 的回复:] 多线程去ping吧,不是foreach的问题
我试过不行, 你在我代码上改改 我看看你怎么弄的。。[/quote] 把try...catch中的放到线程函数中去,然后每次遍历就创建一个线程,把线程放到一个容器中,最后在main退出之前等待所有的线程退出…………
冬王 2017-08-03
  • 打赏
  • 举报
回复
引用 3 楼 lianshaohua 的回复:
多线程去ping吧,不是foreach的问题
我试过不行, 你在我代码上改改 我看看你怎么弄的。。
冬王 2017-08-03
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
仅供参考:
#include <windows.h>
#include <stdio.h>
#include <string.h>
char YN(int k) {
    FILE *f;
    char fn[40];
    char ln[80];
    char yn;
    int n;

    yn='N';
    sprintf(fn,"d:\\ping%d.txt",k);
    f=fopen(fn,"r");
    if (NULL!=f) {
        n=0;
        while (1) {
            if (NULL==fgets(ln,80,f)) break;//
            if (strstr(ln,"ms ")) {
                yn='Y';
                break;//
            }
            n++;
            if (n>=4) break;//
        }
        fclose(f);
    }
    return yn;
}
void main(int argc,char **argv) {
    char cmdstr[256];
    int i;
    int IP[3];
    char c;

    if (argc<2) {
    USAGE:
        printf("Usage example:\n    %s 192.168.60.\nto test 192.168.60.1-254\n",argv[0]);
        return;
    }
    if (4==sscanf(argv[1],"%d.%d.%d%c",&IP[0],&IP[1],&IP[2],&c)) {
        if (0<=IP[0] && IP[0]<=255
         && 0<=IP[1] && IP[1]<=255
         && 0<=IP[2] && IP[2]<=255
         && '.'==c) {
            for (i=1;i<255;i++) {
                sprintf(cmdstr,"cmd /c ping %s%d -n 1 -w 1000 >d:\\ping%d.txt",argv[1],i,i);
                WinExec(cmdstr,SW_HIDE);
            }
            Sleep(3000);
            for (i=1;i<255;i++) {
                printf("%c %s%d\n",YN(i),argv[1],i);
            }
            Sleep(3000);
            WinExec("cmd /c del /q d:\\ping*.txt",SW_HIDE);
        } else goto USAGE;
    } else goto USAGE;
}
然而我看不懂
赵4老师 2017-08-03
  • 打赏
  • 举报
回复
仅供参考:
#include <windows.h>
#include <stdio.h>
#include <string.h>
char YN(int k) {
    FILE *f;
    char fn[40];
    char ln[80];
    char yn;
    int n;

    yn='N';
    sprintf(fn,"d:\\ping%d.txt",k);
    f=fopen(fn,"r");
    if (NULL!=f) {
        n=0;
        while (1) {
            if (NULL==fgets(ln,80,f)) break;//
            if (strstr(ln,"ms ")) {
                yn='Y';
                break;//
            }
            n++;
            if (n>=4) break;//
        }
        fclose(f);
    }
    return yn;
}
void main(int argc,char **argv) {
    char cmdstr[256];
    int i;
    int IP[3];
    char c;

    if (argc<2) {
    USAGE:
        printf("Usage example:\n    %s 192.168.60.\nto test 192.168.60.1-254\n",argv[0]);
        return;
    }
    if (4==sscanf(argv[1],"%d.%d.%d%c",&IP[0],&IP[1],&IP[2],&c)) {
        if (0<=IP[0] && IP[0]<=255
         && 0<=IP[1] && IP[1]<=255
         && 0<=IP[2] && IP[2]<=255
         && '.'==c) {
            for (i=1;i<255;i++) {
                sprintf(cmdstr,"cmd /c ping %s%d -n 1 -w 1000 >d:\\ping%d.txt",argv[1],i,i);
                WinExec(cmdstr,SW_HIDE);
            }
            Sleep(3000);
            for (i=1;i<255;i++) {
                printf("%c %s%d\n",YN(i),argv[1],i);
            }
            Sleep(3000);
            WinExec("cmd /c del /q d:\\ping*.txt",SW_HIDE);
        } else goto USAGE;
    } else goto USAGE;
}
ztenv 2017-08-03
  • 打赏
  • 举报
回复
多线程去ping吧,不是foreach的问题
容器类是隐式共享(implicitly)的,可重入(reentrant)的和线程安全的。并且在速度上进行了优化,内存占用少,内联代码扩展少,从而可以产生更小的可执行文件。 为容器遍历提供了两种迭代器(Java-style,STL-style),并且QT提供了foreach关键字,更加方便元素遍历。其中,Java风格的迭代器更容易使用,特别是对于Java工作人员来说,它提供了高层次的函数;然而,STL风格的迭代器会更高效,并且可以和Qt和STL的通用算法结合使用。 Qt中的容器和STL中的类似,也分为序列式容器和关联式容器。 序列式容器有:QList,QLinkedList,QVector,QStack,QQueue。对大部分应用程序来说,QList都是一个很好的选择。尽管它在底层被实现为一个array-list,但它为我们提供了非常快速的添加操作,包括在头部添加和在尾部添加。如果你确实需要一个linked-list,可以使用QLinkedList;如果你想确保你的元素占用连续的内存空间,可以使用QVector。而QStack和QQueue是两个提供了LIFO和FIFO语义的方便类。 除了序列式容器,Qt中还提供了关联式容器:QMap,QMultiMap,QHash,QMultiHash,QSet。这些容器中存储的都是key-value对。其中,"Multi"容器又支持一个key可以关联多个value。"Hash"容器通过使用一个hash函数而不是二分搜索提供了更快速的查找操作。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧